accepts_nested_attributes_for &: reject_if. Как предотвратить отклонение, пока родительская ассоциация не спасет? - PullRequest
7 голосов
/ 31 октября 2009
class Gift < ActiveRecord::Base
  has_many :contributions
  accepts_nested_attributes_for :contributions, :reject_if => proc { |a| a['amount'].blank? }

Вклад имеет атрибут: псевдоним. В форме: новая, она предварительно заполнена реальным именем пользователя. Пользователь может решить изменить его на «Дядя Боб» (или любой другой). К сожалению, с: reject_if, если сумма не указана во вкладе, изменение: nickname теряется, когда: new перезагружается в случаях, когда @gift недопустим. Это происходит потому, что вложенные contrib_attributes отклоняются Как сохранить изменение: nickname и обрабатывать отклонение только при фактическом сохранении @gift?

Ответы [ 2 ]

9 голосов
/ 31 октября 2009
class Gift < ActiveRecord::Base
  has_many :contributions
  accepts_nested_attributes_for :contributions,
    :reject_if => proc { |a| a['amount'].blank? }
end

class Contribution < ActiveRecord::Base
  belongs_to :gift
  validates_presence_of :nickname, :amount
end

... в форме подарка ...

f.text_field :nickname, :value => (params[:gift][:contributions_attributes]['0'][:nickname] rescue @m.full_name)

Это сохраняет: псевдоним изменяется из-за неудачных проверок и по-прежнему отбрасывает вложенные вклады, содержащие: только псевдоним.

0 голосов
/ 31 октября 2009

Я думаю, что вы ищете проверку в модели Contribution вместо предложения: reject_if.

: reject_if выбросит всю запись, если условие выполнено. Неудачные проверки в модели участия заблокируют сохранение соответствующего подарка. Однако @gift сохранит вклад независимо от значения его суммы при неудачном сохранении, что дает вашему пользователю возможность исправить его, когда контроллер снова выполнит новое действие.

Решение состоит в том, чтобы удалить предложение: reject_if из оператора accepts_nested_attributes_for и добавить validates_presence_of_amount в модели Contributions.

class Gift < ActiveRecord::Base
  has_many :contributions
  accepts_nested_attributes_for :contributions
  ...
end

class Contribution < ActiveRecord::Base
  validates_presence_of :amount
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...