我正在尝试发布一个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}}
答案 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中提供了有关如何允许不同类型的参数的更多示例,您也可以查看它。
希望这是有帮助的