0

Rails の関連付けられたモデルに対して create_association(attributes = {}) メソッドを機能させるのに問題があります。

class Gwgiftwhip < ActiveRecord::Base
  has_one :gift, :autosave => true, :dependent => :destroy
  validates :gift, :presence => true  
end

class Gift < ActiveRecord::Base
  belongs_to :gwgiftwhip
end

Active Record Associations Guideのbelongs_to セクションでは、 create_association(attributes = {}) メソッドを使用して関連モデルを作成し、begs_to 関連付けを使用するときにそれを保存できるようにする必要があることを示唆しています。ただし、以下の実装では、関連するモデル パラメータ 'gift' が設定されていないため、保存エラーが発生します。

class GiftsController < ApplicationController
...
def inbound
  @gift = Gift.new(params.slice(*Gift.new.acceptable))    
  if @gift.create_gwgiftwhip({:user_id => @gift.user_id}, :without_protection => true)
    ...
  end
end

以下は機能しますが、意図した用途の範囲外のようです。関連モデルを作成し、それ自体を関連モデルとして設定しています。これを保存するには、別の手順が必要です。

class GiftsController < ApplicationController
...
def inbound
  @gift = Gift.new(params.slice(*Gift.new.acceptable))    
  @gift.create_gwgiftwhip({:user_id => @gift.user_id}, :without_protection => true).gift = @gift
  if @gift.gwgiftwhip.save
    ...
  end
end
4

1 に答える 1

1

向きを変えてみてください:

def inbound
  @gift = Gift.new( params.slice( *Gift.new.acceptable ) )    
  if Gwgiftwhip.create( {user_id: @gift.user_id, 
                            gift: @gift}, without_protection: true )
    ...
  end
end

設定が自動的gift=に設定されるように、Gwgiftwhip のオーバーライドを検討することもできます。例:giftuser_id

class Gwgiftwhip
  has_one :gift, :autosave => true, :dependent => :destroy

  def gift=( gift )
    super( gift )
    self.user_id = gift.user_id
  end
end
于 2013-05-21T01:59:17.290 に答える