2

私は最初の Rails プロジェクトに取り組んでおり、次のモデル関係があります。

class Profile < ActiveRecord::Base
  belongs_to :identifiable, polymorphic: true
  accepts_nested_attributes_for :students

class Student < ActiveRecord::Base
  has_one :profile, as: :identifiable
  attr_accessible :profile

関連するコントローラーは次のとおりです。

class StudentsController < ApplicationController
  def new
    @student = Student.new
  end

  def create
    @student = Student.new(params[:student])
    if @student.save
      redirect_to root_path
    else
      render 'new'
   end
  end
end

class ProfilesController < ApplicationController
  def new
    @profile = Profile.new
  end

 def create
    @profile = Profile.new(params[:profile])
    @profile.save
 end
end

私がやろうとしているのはStudent、にある次のフォームで新しいを作成することですstudents\new.html.erb:

<h1>Create a new Student Account</h1>
<div class="row">
  <div class="span6 offset3">
  <%= form_for(@student) do |f| %>
    <%= render 'shared/error_messages' %>
    <%= f.fields_for :profile, @profile do |builder| %>
      <%= builder.label :name %>
      <%= builder.text_field :name %>

      <%= builder.label :email %>
      <%= builder.text_field :email %>

      <%= builder.label :password %>
      <%= builder.password_field :password %>

      <%= builder.label :password_confirmation, "Confirmation" %>
      <%= builder.password_field :password_confirmation %>
    <% end %>
  </div>
</div>
  <p><%= f.submit "Submit", class: "btn btn-large btn-primary" %></p>
<% end %>

フォームを送信しようとすると、次のエラー メッセージが表示されますNo association found for name 'students'. Has it been defined yet?。前もって感謝します。

4

2 に答える 2

6

モデルが別のモデルのネストされた属性を受け入れるためには、他のモデルへの関連付けを宣言する必要があります。Profileがありますが、accepts_nested_attributes_for :students対応する関連付けが定義されていません(たとえばhas_many :students)。そのため、特定のエラーが発生します。ただし、あなたの場合、この関連付けは正しくありません。

通常、modelがmodelのAネストされた属性を受け入れる場合、またはBのいずれA has_many BA has_one B。あなたの場合、あなたは持っていA belongs_to Bます。より良いデザインは

class Profile < ActiveRecord::Base
  belongs_to :identifiable, polymorphic: true

class Student < ActiveRecord::Base
  attr_accessible :profile_attributes
  has_one :profile, as: :identifiable
  accepts_nested_attributes_for :profile
于 2012-10-09T01:49:27.317 に答える
1

あなたの学生は特異であるべきですか?すなわち:accepts_nested_attributes_for :student

編集:また、学生が_oneプロファイルを持っていて、学生フォームにfields_for呼び出しが含まれている場合、学生はプロファイルのネストされた属性を受け入れる必要があります(私は思う...)

于 2012-10-09T01:07:43.373 に答える