Rails 4带JSON数组的强参数

时间:2015-11-02 18:11:08

标签: ruby-on-rails json

我正在尝试发布一个JSON对象数组,但我总是得到一个422 Unprocessable Entity响应 这是我的控制器动作:

@myuser

其中,与下面显示的http调用一起,@myuser =[{"name"=>"name11", "address"=>"addr1"}, {"name"=>"name22", "address"=>"addr2"}, {"name"=>"name33", "address"=>"addr132"}, {"name"=>"name4", "address"=>"addr4"}] 数组看起来像这样

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

这是HTTP JSON正文

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 操作?或者我错了吗?

提前感谢您的帮助。

解决方案:

我认为这段代码有可能做得更好一点,但现在这对我有用了:

{{1}}

2 个答案:

答案 0 :(得分:0)

关于参数的问题,你的问题是你使用整个参数哈希,而不是将它缩小到你感兴趣允许的'用户'位。所以你得到了所有其他的东西,例如格式。 (顺便说一句,不应该更正确地称为'用户'而不是单数'用户'?无论如何......别介意:)

我认为它应该像

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

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

这里有一些关于strong_parameters gem的文档中的嵌套参数:

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

希望有帮助...

答案 1 :(得分:-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

请注意,我们不会反复从params中获取JSON哈希值。由于我们已经在@myusers变量中使用了所有内容,因此需要做的就是循环遍历它,并使用哈希值在循环的当前索引处保存User的新实例。

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

希望这是有帮助的