Rails - 嵌套属性的Mass-Assignment ForbiddenAttributesError

时间:2014-09-29 06:06:35

标签: ruby-on-rails ruby-on-rails-4 params mass-assignment

我遇到了嵌套属性的质量分配问题。我在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!,但如果我理解正确,则会授权资源的所有参数,并且我只想允许其中一些参数。

2 个答案:

答案 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散列中的所有参数,并确保它们已被允许,例如,commitcontry_id似乎丢失了。