私はゲストが招待コードとRSVPオンラインでログインできるウェディングウェブサイトを構築しています。次のように私のモデルは以下のとおりです。Rails 3 - ネストされた属性を持つリソースを作成する正しい方法は何ですか?
招待
class Invitation < ActiveRecord::Base
attr_accessible # None are accessible
# Validation
code_regex = /\A[A-Z0-9]{8}\z/
validates :code, :presence => true,
:length => { :is => 8 },
:uniqueness => true,
:format => { :with => code_regex }
validates :guest_count, :presence => true,
:inclusion => { :in => 1..2 }
has_one :rsvp, :dependent => :destroy
end
RSVP
class Rsvp < ActiveRecord::Base
attr_accessible :guests_attributes
belongs_to :invitation
has_many :guests, :dependent => :destroy
accepts_nested_attributes_for :guests
validates :invitation_id, :presence => true
end
ユーザーレビュー
class Guest < ActiveRecord::Base
attr_accessible :name, :email, :phone, :message, :attending_wedding, :attending_bbq, :meal_id
belongs_to :rsvp
belongs_to :meal
email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i
validates :name, :presence => true
validates :email, :allow_blank => true, :format => { :with => email_regex }
validates :attending_wedding, :inclusion => {:in => [true, false]}
validates :attending_bbq, :inclusion => {:in => [true, false]}
validates :rsvp_id, :presence => true
validates :meal_id, :presence => true
end
マイロジック私は招待状でデータベースをシードし、ゲストがサイトにログインすると、それぞれのゲスト用のセクション(ビューのform_forを使用)を含むRSVPフォームが提示されます。
新しい、私のrsvps_controllerでアクションを作成するには、次のとおりです。
def new
@title = "Edit RSVP"
@rsvp = current_invitation.build_rsvp
current_invitation.guest_count.times { @rsvp.guests.build }
@meals = Meal.all
end
def create
@rsvp = current_invitation.build_rsvp(params[:rsvp])
if @rsvp.save
flash[:success] = "RSVP Updated."
redirect_to :rsvp
else
@title = "Edit RSVP"
@meals = Meal.all
render 'new'
end
end
現状では、それは「お客様は、RSVP空白にすることはできません」と文句を言いよう、このコードは、RSVPは保存されません。 rsvpレコードがまだDBに保存されていないため、これは(おそらく)理解されているため、まだIDはありません。私はこれをrsvp_idの検証を取り除くことによって動作させることができますが、それは間違っていると感じます。すべてのゲストレコードはにRSVPとの関連付けが必要です。一方、検証なしでは、コンソールを介して見るとレコード結合が正しくなります。
この状況を処理する標準的な方法(慣用的な方法)は何ですか?
おかげで、 ノエル
こんにちはアゾロ、あなたの答えをありがとう。残念ながら、それは問題を解決しません。 'validates:rsvp_id、:presence => true'を使うときと同じエラーが出ます – noelob