【问题标题】:'Can't mass-assign protected attributes' when implementing Multiple Table Inheritance with nested forms使用嵌套表单实现多表继承时“无法批量分配受保护的属性”
【发布时间】:2014-07-30 17:17:48
【问题描述】:

您好,我正在尝试在我的应用程序中实现 MTI。我有一个 Person 模型和 2 个继承自它的模型:Client 和 TeamMember。创建团队成员时,我想将个人(名字和姓氏,电子邮件等)和团队成员(经验级别,团队类型,是否领导)保存到数据库值。我正在使用嵌套属性表单,因此在我的团队成员表单中,我嵌套了人员字段。不幸的是,我在尝试保存时收到“无法批量分配受保护的属性:人员”错误。谁能告诉我如何解决这个问题?谢谢! 型号:

更新了 TeamMember 类,但仍然是同样的错误 还尝试了 people_attributes 和 people_attributes,但这些都不起作用

class TeamMember < ActiveRecord::Base
  has_many :project_team_members
  has_many :projects, through: :project_team_members
  has_one :person, as: :profile, dependent: :destroy
  accepts_nested_attributes_for :person
  attr_accessible :person_attributes, :experience_level, :lead, :qualification, :team
end

class Person < ActiveRecord::Base
  belongs_to :company
  belongs_to :profile, polymorphic: true
  attr_accessible :email, :first_name, :last_name, :phone_number, :profile_id,     :profile_type
end

控制器如下:

class TeamMembersController < ApplicationController
  def create
    person = Person.create! { |p| p.profile = TeamMember.create!(params[:team_member]) }
    redirect_to root_url
  end

和观点:

<%= form_for(@team_member) do |f| %>
  <%= f.fields_for :person do |ff| %>
    <div>
      <%= ff.label :first_name %>
      <%= ff.text_field :first_name %>
    </div>
    <div>
      <%= ff.label :last_name %>
      <%= ff.text_field :last_name %>
    </div>
    <div>
      <%= ff.label :phone_number %>
      <%= ff.text_field :phone_number %>
    </div>
    <div>
      <%= ff.label :email %>
      <%= ff.text_field :email %>
    </div>
    <div>
      <%= ff.label :company_id %>
      <%= ff.text_field :company_id %>
    </div>
<% end %>
<div class="field">
  <%= f.label :team %><br />
  <%= f.text_field :team %>
</div>
<div class="field">
  <%= f.label :experience_level %><br />
  <%= f.text_field :experience_level %>
</div>
<div class="field">
  <%= f.label :qualification %><br />
  <%= f.text_field :qualification %>
</div>
<div class="field">
  <%= f.label :lead %><br />
  <%= f.check_box :lead %>
</div>
  <div class="actions">
<%= f.submit %>
</div>

更新的 TeamMembersController(感谢 Tiago 提供的解决方案)

def new
  @team_member = TeamMember.new
  @team_member.build_person

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @team_member }
  end
end

def create
  @team_member = TeamMember.create!(params[:team_member])
  redirect_to root_url
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 inheritance nested-forms multi-table-inheritance


    【解决方案1】:

    要以嵌套形式批量分配属性,您需要指定:

    class TeamMember < ActiveRecord::Base
      has_many :project_team_members
      has_many :projects, through: :project_team_members
      has_one :person, as: :profile, dependent: :destroy
      :experience_level, :lead, :qualification, :team #what is this line doing??
      accepts_nested_attributes_for :person      
      attr_accessible :person_attributes    
    end
    

    编辑:

    在表单之前调用的动作中,您需要建立人。喜欢:

    @team_member = TeamMember.new
    @team_member.build_person
    

    然后您将有一个人(非持久化)与@team_member 关联。

    【讨论】:

    • 实际上当我添加行 Accepts_nested_attributes_for :person 并刷新页面时,person 的字段完全消失了。
    • 好的。它可能消失了,因为您传递的 @team_member 刚刚初始化而没有关联的人。对吗?
    • 是的,我确实是。当调用新动作时,我初始化 TeamMember 对象。但是,当我尝试添加建议的行 (@team_member.person.build) 时,它会返回 'undefined method `build' for nil:NilClass'。这是为什么?顺便提一下 Tiago- 我真的很感谢你的帮助。
    • 对不起。我的错。我编辑了答案。您应该尝试:@team_member.build_person 当它是 has_one 关联时。 build() 用于 has_many。
    • 我通过改变上面的创建方法解决了这个问题。 Tiago- 你是最棒的 :) 非常感谢!
    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多