1

こんにちは、アプリケーションに MTI を実装しようとしています。Person モデルと、それを継承する 2 つのモデルがあります。Client と TeamMember です。チーム メンバーを作成するときに、人物 (姓名、電子メールなど) とチーム メンバー (経験レベル、チームのタイプ、リードかどうか) の両方の値をデータベースに保存したいと考えています。ネストされた属性フォームを使用しているため、チーム メンバー フォームで個人フィールドをネストしています。残念ながら、保存しようとすると「保護された属性を一括割り当てできません:人」というエラーが表示されます。これを解決する方法を誰か教えてもらえますか? ありがとう!モデル:

UPDATED TeamMember クラスですが、同じエラー で people_attributes と person_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>

UPDATED 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
4

1 に答える 1

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 に関連付けられた 1 人の人物 (永続化されていない) が作成されます。

于 2014-07-30T17:49:19.010 に答える