2011-07-14 46 views
1

我在我的Rails應用這些模型(很多東西顯然略):驗證是否阻止從父模型進行保存,只需刪除它們?

class Invitation < ActiveRecord::Base 
    belongs_to :team 
    validates :team_id, :presence => true 
end 

class Team < ActiveRecord::Base 
    has_many :invitations 
    accepts_nested_attributes_for :invitations 

    before_validation :set_invitation_association 
    private 
    def set_invitation_association 
     invitations.each do |invite| 
     if invite.new_record? 
      # this bit doesn't work since self.id is nil 
      invite.team = self 
     end 
     end 
    end 
end 

現在我想要做的就是讓這個在CURRENT_USER可以在同一時間邀請人們進入他的團隊因爲他使用嵌套形式創建它。

問題當然是,當我將POST團隊和邀請屬性添加到teams_controller時,邀請無法通過驗證,因爲他們沒有team_id。但我不能給他們一個team_id,因爲他們與之相關的團隊沒有一個,因爲它還沒有被保存到數據庫。

有沒有一種方法可以實現這一點,或者我只需要從邀請模型中刪除驗證?我寧願不這樣做,因爲我的應用程序中有其他方法可以發送邀請,我不想讓自己開放,以便我可以在沒有團隊的情況下保存邀請。

或者我剛剛得到了錯誤的想法,在場驗證只是爲了確保用戶填寫所有字段,而不是阻止程序員犯錯誤!

對不起這個問題。

<%= form_for(@team) do |f| %> 
    <% if @team.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:</h2> 

     <ul> 
     <% @team.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 

    <h3>Invite some teammates</h3> 
    <%= f.fields_for :invitations, @invitation do |invite_fields| %> 
    <p> 
     <%= invite_fields.label :recipient_name %> 
     <%= invite_fields.text_field :recipient_name %><br /> 

     <%= invite_fields.label :recipient_email %> 
     <%= invite_fields.text_field :recipient_email %><br /> 
    </p> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

對嵌套屬性您有一個錯誤的想法。如果你的表單設置正確,那麼activerecord將首先保存團隊對象,然後是邀請,包括團隊ID;您不需要手動設置關聯。發佈你的表單將有助於你的問題。 – mark

+0

我明白了!至少我知道我對某件事有錯誤的想法!我用表單編輯了問題。 –

+0

從我記得那看起來確實。你沒有使用before_validation方法試過嗎?這裏有幾個很好的屏幕錄像。 http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2 – mark

回答

1

有一個類似的問題,這在這裏:

accepts_nested_attributes_for child association validation failing

你應該放棄TEAM_ID的驗證我的opnion。它作爲ActiveRecord關係的一部分被實例化;作爲嵌套形式的結果。如果您在創建團隊後創建邀請(這似乎很可能),那麼在關聯團隊不是新記錄的情況下進行條件驗證。

http://railscasts.com/episodes/41-conditional-validations

+0

是的,你是對的重複。不知何故,我在我的搜索中沒有找到這個問題。我投票結束。 –

相關問題