【问题标题】:Rails - Mass-Assignment ForbiddenAttributesError for nested attributeRails - 嵌套属性的质量分配 ForbiddenAttributesError
【发布时间】:2014-09-29 06:06:35
【问题描述】:

我遇到了嵌套属性的批量分配问题。我在 params 中有一个哈希值,它代表一个由 form_for 表单产生的对象。

我尝试像这样授权参数,但我收到以下错误...

ActiveModel::ForbiddenAttributesError

params.require(:country).permit(:language, :flag_path)
@country.update(params[:country])

这里是参数数组:

{"utf8"=>"✓",
 "authenticity_token"=>"xxxxxxx",
 "country"=>{"language"=>"xxxx",
 "flag_path"=>"xxxxx"},
 "commit"=>"Update",
 "country_id"=>"xxxx"}

感谢您的帮助。

编辑:我知道用户 permit! 是可能的,但如果我理解正确,这会授权资源的所有参数,我只想允许其中的一部分。

【问题讨论】:

  • 你能显示你的国家控制器代码吗?

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


【解决方案1】:

你的代码有两个问题:

第一个: 考虑以下是否是您的控制器中的许可参数方法:

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

【讨论】:

  • 好像没看懂权限。现在我愿意。我唯一不明白的是 id 的东西...
【解决方案2】:

您对params.require(:country).permit 所做的事情是正确的做法。如果任何一个参数不被允许,ActiveModel::ForbiddenAttributesError 将被提升,因此您很可能错过了其中一个参数。

检查参数哈希中的所有参数并确保它们已被允许,例如,commitcontry_id 似乎丢失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    相关资源
    最近更新 更多