обратный validates_associated - PullRequest
1 голос
/ 17 июля 2010

Я пытаюсь проверить поле в зависимости от атрибутов связанной модели.смотреть на код будет больше смысла (я надеюсь)

class User < ActiveRecord::Base
  has_and_belongs_to_many :user_groups
  has_one :profile, :dependent => :destroy

  accepts_nested_attributes_for :profile
  validates_associated \
    :profile,
    :allow_destroy => true
end


class Profile < ActiveRecord::Base
  belongs_to  :user

  validates_presence_of \
    :business_name,
    :if => self.user.user_groups.first.name == 'Client'
end

, когда я отправляю форму для создания нового пользователя, я получаю

undefined method `user_groups' for nil:NilClass

, в основном я хочу проверить тольконаличие поля business_name, если я создаю нового клиента.

Я также пытался использовать

:if => Proc.new { |p| p.user.user_groups.first.name == 'Clients' }

с теми же результатами.

возможно, я лаю полностьюнеправильное дерево, но какие-либо предложения по выполнению этого?

1 Ответ

1 голос
/ 17 июля 2010

У вас есть ассоциация own_to, которая принимает user_id и находит объект User с этим идентификатором. Однако модель вашего профиля проверяется перед сохранением вашего пользователя, поэтому у нее нет идентификатора. В этом случае ваша проверка в профиле не может вызвать пользователя.

Вам необходимо распутать эту логику, чтобы она активировалась пользователем или в профиле, но профиль не может ожидать, что созданный пользователь выполнит свою собственную проверку, если вы хотите сначала проверить профиль.

Это проблема курицы и яйца.

Вы можете исправить это, добавив столбец наподобие is_business в Profile и изменив код следующим образом:

class Profile < ActiveRecord::Base
  belongs_to  :user

  validates_presence_of \
    :business_name,
    :if => is_business?
end

и обновите форму своего профиля, чтобы правильно установить is_business в контексте.

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