【问题标题】:ForbiddenAttributesError in Rails 4 with a has_many polymorphic accepts_nested_attributes_for formRails 4 中的 ForbiddenAttributesError 具有 has_many 多态 accept_nested_attributes_for 形式
【发布时间】:2014-11-17 21:36:22
【问题描述】:

尝试使用嵌套表单为我的成员模型创建地址。

型号

class Member < ActiveRecord::Base
  has_many :addresses, :as => :addressable, dependent: :destroy

  accepts_nested_attributes_for :addresses
end

class Address < ActiveRecord::Base
  belongs_to :addressable, :polymorphic => true
end

控制器

**new**
  @member = Member.new
  @member.addresses.build

**create**
  @member = Member.new(member_params)

**update**
  @member.update(member_params)
    # Am I doing this right? Haven't gotten this far in the process without error.

**private**
  # Never trust parameters from the scary internet, only allow the white list through.
  def member_params
    params.require(:member).permit(
      :first_name,
      :last_name,
      :birthdate,
      addresses_attributes: [:street1, :street2, :city, :state, :zip, :country, :id]
      )
  end

查看

= simple_form_for @member do |f|
  = f.simple_fields_for :addresses do |address|
    = address.input :street1
    = address.input :street2
    = address.input :city
    = address.input :state
    = address.input :zip
    = address.input :country, :priority => [ "United States" ] 
  = f.submit "Save", class: "btn btn-success"

错误

ActiveModel::ForbiddenAttributesError

使用撬

 pry(#<MembersController>)> member_params
    Unpermitted parameters: address
    => {}

 pry(#<MembersController>)> params
    => {"utf8"=>"✓",
    "_method"=>"patch",
    "authenticity_token"=>"44f8YqwLCuVKnKDC2uZUDodOjPtgi+EcJKPQh4IqwPA=",
    "member"=>{"address"=>{"street1"=>"1234 Fake St.", "street2"=>"", "city"=>"Tacoma", "state"=>"WA", "zip"=>"999999", "country"=>"US"}},
    "commit"=>"Save",
    "action"=>"update",
    "controller"=>"members",
    "id"=>"1"}

希望有人能提供帮助!谢谢! 我不明白问题是什么......我很确定我正确地接受了嵌套属性,很好奇我哪里出错了!我是 strong_parameters 的新手,所以希望它很简单...

更新 遵循建议并更改

= simple_fields_for :address do |address|

= simple_fields_for :addresses do |address|

我还更改了 member_params 以包含 :id 的addresses_attributes

...
addresses_attributes: [:street1, :street2, :city, :state, :zip, :country, :id]
...

我也尝试将 :member_id 添加到addresses_attributes,但我仍然收到ForbiddenAttributesError

还有什么想起来的吗​​? :) 谢谢大家。

【问题讨论】:

    标签: ruby-on-rails-4 nested-forms polymorphic-associations strong-parameters


    【解决方案1】:

    您的参数中没有“addresses_attributes”,您只有“address”。如果您希望能够输入多个地址(您的数据模型建议),那么您需要更改为如下内容:

    = simple_form_for @member do |f|
      = f.simple_fields_for :addresses do |address|
        = address.input :street1
    ...
    

    正如 Andrey 在另一个答案中提到的,您还需要将 :id 添加到 address_attributes 数组中的参数列表中,如果您还希望能够从表单中删除地址,还需要添加 :_destroy

    【讨论】:

    • 更改为 =f.simple_fields_for :addresses 并按照 Andre 的建议将 :id 属性添加到 member_params,我仍然得到相同的 ForbiddenAttributesError。
    • 您需要更新您的问题并显示您现在的参数。
    • 更新了我的问题。另外,我对 MemberController 的更新操作看起来是否正确?
    • 您没有显示参数。你的更新是错误的 - 你只需要@member.update(member_params)
    • 啊哈!我遇到了 simple_fields_for :addresses 的问题——不知何故,我正在查看旧版本的浏览器缓存,并且正在测试 :address 字段的 html。不过,我是否需要在控制器中的任何位置使用 @member.addresses.build 才能完成这项工作?否则表单不会呈现。我目前在 Member#show 上以模态形式调用该表单。感谢您的帮助迈克尔!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多