我在我的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 %>
對嵌套屬性您有一個錯誤的想法。如果你的表單設置正確,那麼activerecord將首先保存團隊對象,然後是邀請,包括團隊ID;您不需要手動設置關聯。發佈你的表單將有助於你的問題。 – mark
我明白了!至少我知道我對某件事有錯誤的想法!我用表單編輯了問題。 –
從我記得那看起來確實。你沒有使用before_validation方法試過嗎?這裏有幾個很好的屏幕錄像。 http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2 – mark