У меня есть эти модели в моем приложении 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 мог приглашать людей в свою команду нав то же время, когда он создает ее с помощью вложенной формы.
Проблема, конечно, заключается в том, что когда я отправляю атрибуты team и приглашения POST для groups_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 %>