Проверки, препятствующие сохранению из родительской модели, просто удалите их? - PullRequest
1 голос
/ 14 июля 2011

У меня есть эти модели в моем приложении 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 %>

1 Ответ

1 голос
/ 14 июля 2011

Здесь есть аналогичный вопрос:

acceptpts_nested_attributes_ для проверки дочерней ассоциации завершился неудачей

Вы должны отказаться от проверки team_id в моем мнении.Он создается как часть отношения ActiveRecord;в результате вложенной формы.Если вы создаете приглашения после того, как команда была создана - это кажется вероятным, - тогда проведите условную проверку, когда связанная команда не является новой записью.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...