我遇到了嵌套属性的质量分配问题。我在params中有一个哈希表示一个由form_for
形式产生的对象。
我试图像这样授权这些参数但是我得到以下错误......
::加载ActiveModel ForbiddenAttributesError
的
params.require(:country).permit(:language, :flag_path)
@country.update(params[:country])
这是params数组:
{"utf8"=>"✓",
"authenticity_token"=>"xxxxxxx",
"country"=>{"language"=>"xxxx",
"flag_path"=>"xxxxx"},
"commit"=>"Update",
"country_id"=>"xxxx"}
感谢您的帮助。
编辑:我知道可以使用permit!
,但如果我理解正确,则会授权资源的所有参数,并且我只想允许其中一些参数。
答案 0 :(得分:3)
您的代码中存在两个问题:
第一: 考虑以下是您控制器中的许可参数方法:
def country_param
params.require(:country).permit(:language, :flag_path)
end
然后您的更新操作应如下所示:
@country.update(country_param)
不是
@country.update(params[:country])
第二:为什么你的更新操作中有country_id
。它应该是id
。
这两个都不会起作用。但是country_id
您将无法进行正确的编辑操作。
无论如何,根据你的参数,你的行动应该是这样的:
def update
@country = Country.find(params[:country_id])
@country.update(country_param)
end
private
def country_param
params.require(:country).permit(:language, :flag_path)
end
答案 1 :(得分:0)
您使用params.require(:country).permit
所做的是正确的方法。如果不允许任何一个参数,将会提出ActiveModel::ForbiddenAttributesError
,因此你很可能错过了其中一个参数。
检查params散列中的所有参数,并确保它们已被允许,例如,commit
和contry_id
似乎丢失了。