2012-01-31 16 views
1

私はゲストが招待コードと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との関連付けが必要です。一方、検証なしでは、コンソールを介して見るとレコード結合が正しくなります。

この状況を処理する標準的な方法(慣用的な方法)は何ですか?

おかげで、 ノエル

答えて

0

「RSVPレコードがまだDBに保存されていないので、」あなたはかなり頭の上に釘を打ちます。協会はそこにあります、rsvp_idはありません。

カスタムバリデータを作成することもできます。何かのように...

class Guest < ActiveRecord::Base 
    ... 
    validate :associated_to_rsvp 
    ... 
private 
    def associated_to_rsvp 
    self.errors.add(:rsvp, "does not exist.") unless self.rsvp 
    end 
end 
+0

こんにちはアゾロ、あなたの答えをありがとう。残念ながら、それは問題を解決しません。 'validates:rsvp_id、:presence => true'を使うときと同じエラーが出ます – noelob

関連する問題