6

私の問題が正確にはわからないので、この質問にはさらに説明が必要かもしれませんが、最も関連性が高いと思われるものは次のとおりです。

結合モデルにはhas_many :through、外部キーではないフィールドがいくつかあります。モデルを構築して保存しようとすると、結合モデルからの非外部キー フィールドで検証エラーが発生します。

私のファイルは次のようになります。

Person.rb

  has_many :wedding_assignments, :dependent => :destroy
  has_many :weddings, :through=>:wedding_assignments
  accepts_nested_attributes_for :weddings
  accepts_nested_attributes_for :wedding_assignments

Wedding.rb

  has_many :wedding_assignments, :dependent => :destroy
  has_many :people, :through=>:wedding_assignments
  accepts_nested_attributes_for :people
  accepts_nested_attributes_for :wedding_assignments

WeddingAssignment.rb

  belongs_to :person
  belongs_to :wedding
  validates_presence_of :role, :person, :wedding

(ロールは文字列です)

people_controller.rb

  def new
    @person = Person.new

    1.times do
      wedding = @person.weddings.build
      1.times do
        assignment = wedding.wedding_assignments.build
        assignment.person = @person
        assignment.wedding = wedding
      end
    end
  end

  def create
    @person = Person.new(params[:person])
    @person.weddings.each do |wedding|
      wedding.wedding_assignments.each do |assignment|
        assignment.person = @person  #i don't think I should need to set person and wedding manually, but I get a validation error if I don't
        assignment.wedding = wedding
      end
    end
 end

返されるパラメーターは次のようになります。

{"first_name"=>"", "last_name"=>"", "weddings_attributes"=>{"0"=>{"wedding_assignments_attributes"=>{"0"=>{"role"=>"Bride's Maid", "budget"=>""}}, "date"=>"", "ceremony_notes"=>""}}}

正確なエラーは次のとおりです。

ActiveRecord::RecordInvalid in PeopleController#create
Validation failed: Role can't be blank

で見ることができるので、これは明らかに正しくありません。params[]

私は何を間違っていますか?

これはレール3.0.0です

4

2 に答える 2

1

そうですね、これはちょっとした推測なので、ここで時間を無駄にしてしまったら申し訳ありません...

あなたの create メソッドのように見えますが、「結婚式」の関係を作成しているように見えます (これは実際には「ふりをする」関係にすぎません。:through => :wedding_assignments を使用しています)。次に、Rails に、Person.new への呼び出しでこれらのオブジェクトを再作成するように依頼しています。私の推測では、中間オブジェクトが存在せずに has_many :through の向こう側にオブジェクトを作成しようとすることで、レールが混乱していると思います。

これを少し再構築したくなるでしょう (テストされていないコード!):

def new
  @person = Person.new
  @wedding = Wedding.new
  @wedding_assignment = WeddingAssignment.new
end

def create
  @person = Person.new(params[:person])
  @wedding = Wedding.new(params[:person])
  @assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person}))
end

これなら最後の一行までいけそうな予感。それを機能させるには、トランザクションを使用する必要があるかもしれません。

def create
  @person = Person.new(params[:person])
  @wedding = Wedding.new(params[:person])
  ActiveRecord::Base.transaction do
    if @person.valid? && @wedding.valid?
      [@person,@wedding].each.save!
      @assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person}))
      @assignment.save!
    end
  end
end

これにより、すべてが正しい順序で作成され、ID が適切なタイミングで利用できるようになります。残念ながら、これは例よりも少し複雑であり、複数の結婚式をサポートするのに苦労することを意味します。

これが役に立ち、袋小路にならないように願っています。

于 2010-10-18T22:20:06.523 に答える
0

「Person.new」を「Person.create」に変更してみてください。データベースにレコードをすぐに作成すると、関連付けに役立つ可能性があります。

于 2010-10-18T21:38:25.080 に答える