2015-11-02 60 views
0

我想发布一个JSON对象数组,但我总是得到一个422 Unprocessable Entity响应。
这是我的控制器操作:Rails 4使用JSON数组的强参数

def create 
@myusers = params[:user] 
@myusers.each do 
User.create(user_params) 
end  

def user_params 
      params.permit(:name,:address) 
end 

里,有了如下图所示HTTP调用在一起时,@myuser阵列看起来像这样

@myuser =[{"name"=>"name11", "address"=>"addr1"}, {"name"=>"name22", "address"=>"addr2"}, {"name"=>"name33", "address"=>"addr132"}, {"name"=>"name4", "address"=>"addr4"}] 

这是HTTP JSON身体

{"user":[{ 
    "name" : "name11", 
    "address":"addr1" 
}, 
{ 
    "name" : "name22", 
    "address":"addr2" 
}, 
{ 
    "name" : "name33", 
    "address":"addr132" 
}, 
{ 
    "name" : "name4", 
    "address":"addr4" 
} 
]} 

和我添加了Accept/Content-Type : application/json标题。 日志文件显示此

Started POST "/api/customer/" for 127.0.0.1 at 2015-11-02 18:45:09 +0100 
Processing by Api::UserController#create as JSON 
Parameters: {"user"=>[{"name"=>"name11", "address"=>"addr1"}, {"name"=>"name22", "address"=>"addr2"}, {"name"=>"name33", "address"=>"addr132"}, {"name"=>"name4", "address"=>"addr4"}]} 
Unpermitted parameters: customer, format 
    (0.4ms) BEGIN 
    (0.3ms) ROLLBACK 
Unpermitted parameters: customer, format 
    (0.3ms) BEGIN 
    (0.3ms) ROLLBACK 
Unpermitted parameters: customer, format 
    (0.2ms) BEGIN 
    (0.6ms) ROLLBACK 
Unpermitted parameters: customer, format 
    (0.3ms) BEGIN 
    (0.4ms) ROLLBACK 
Unpermitted parameters: customer, format 
    (0.3ms) BEGIN 
    (0.4ms) ROLLBACK 
Completed 422 Unprocessable Entity in 62ms (Views: 0.6ms | ActiveRecord: 7.0ms) 

每个单个对象的是ApplicationControllerParameter所以应该是可以直接调用每个条目的user_params行动?还是我错了?

在此先感谢您的帮助。

解决方案:

我觉得有š一些可能性,该代码可以做多一点很好,但,这是现在的工作对我来说:

def user_params 
     params.permit(user: [:name,:address]) 
    end 

    def create 
     user_params[:user].each do |u| 
      User.create(u) 
     end 
    end 
+0

'客户'和'格式'参数来自哪里? –

+0

我认为客户参数是主要的JSON键,然后是哈希数组,我总是因为我不知道的原因获得未经许可的格式参数 – theDrifter

回答

0

您的问题尽可能的问题关于参数的问题是,你正在使用整个参数散列,而不是缩小到你有兴趣允许的'用户'位。所以你可以得到所有其他的东西,例如格式。 (顺便说一句,不应该是更正确地称为“用户”,而不是单数“用户”?反正...别介意:)

我想应该是这样的

params.permit(user: [:name, :address]) 

params.require(:user).permit?([:name, :address]) 

有一点关于在strong_parameters宝石这里的文档嵌套参数:

https://github.com/rails/strong_parameters#nested-parameters

希望对你有帮助...

+0

嘿,感谢您的链接。显示编码嵌套参数的这一行非常有帮助。但我无法实现它的工作。用你的第二条语句,方法许可没有在数组上定义,第一个方法返回带有顶部'用户'键的完整数组。我也试过params.permit(:customer => [:name,:address]),但没有成功 – theDrifter

+0

现在没事了,我明白了:)代码的第一行工作。由于关键是一个数组,并且值(数组)包含我需要以不同的方式进行迭代的哈希值:) uufff – theDrifter

-1

所以,你有一个通过params传入的哈希数组,需要被允许,然后你对数组做一个简单的循环来保存每个数据到数据库。

第一步是获得params权限。

可以check the documentation here for more insight into permitting params.

让我们定义users_params私有方法如下:

def users_params 
    params.permit(user: []) #declare that the parameter should be an array of permitted scalars by mapping it to an empty array 
end 
create行动

然后:

def create 
    @myusers = users_params #this returns an array of the user hashes passed from params 
    # Now, loop through these hashes, and create new users with their values 
    @myusers.each do |user_hash| 
    User.create(user_hash) 
    end 
end 

请注意,我们不会重复去获取JSON哈希从参数。由于我们已经在我们的@myusers变量中包含了所有内容,因此所需做的只是遍历它,并在散列的当前索引处保存一个具有散列的新实例。

有关如何允许不同类型的参数的更多示例,请参阅the above documentation,您也可以查看它。

希望这有帮助

+0

嗨。 tahnks的答案,但你的解决方案不适合我。 '@ myuser'总是零。我在'@ myuser' params [:user]中得到了它的工作,但我无法直接存储'user_hash'。我需要先调用to_hash否则我会得到forbittenattributes错误 – theDrifter