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

Я не уверен, связана ли эта проблема с недостатком знаний или с проблемой в моем дизайне.

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

Однако разница между обычным пользователем и менеджером очень мала с точки зрения того, какие данные они имеют(но очень разные с точки зрения того, какие разрешения им разрешены).Поэтому я решил использовать одну модель User для них обоих, а затем два контроллера, users_controller и Manager_controller, чтобы обслуживать две разные формы регистрации и полученные запросы на создание.Возможно, это просто неправильный способ справиться с этой ситуацией.

У меня есть некоторые настройки проверки в этой модели, и я хочу быть в состоянии гарантировать, что некоторые из этих проверок запускаются в начальной форме регистрации(когда гость становится пользователем, через users_controller), а остальные запускаются во второй форме регистрации (когда пользователь становится менеджером, через Manager_controller).Тем не менее, я использую, например, validates_presence_of, тогда он проверяет валидацию в обеих формах и жалуется, что я, например, не спрашиваю у моих обычных пользователей дату рождения.

Я знаю, как пропустить проверкина конкретные действия, но как это сделать для разных контроллеров?

Ответы [ 3 ]

4 голосов
/ 19 сентября 2011

Проверки на стороне модели, поэтому они не зависят от контроллеров.Кстати, кажется, что вы говорите о ролевом подходе.

Вы можете достичь своих целей, используя if утверждение о проверках.

validates :date_of_birth, :presence => true, :if => :manager?

def manager?
  # It actually  depends on your design. 
  # You can use any authorization library.

  self.role == "manager"
end

Например, популярным является канкан .

1 голос
/ 19 сентября 2011

Как насчет

validates_presence_of :something, :if=>:manager?

def manager?
  self.manager
end

Или чтобы пропустить проверки, вы можете сделать

@user.save(false)

с одного из контроллеров

1 голос
/ 19 сентября 2011

Я полагаю, что у пользователя есть какой-то атрибут или ассоциация, в которой хранятся его роли.Каждый валидатор в rails (например, validates_presence_of) может быть условным в том смысле, что он запускается только тогда, когда Proc / Method, предоставленный вами через опцию: if, возвращает true.В таком Proc вы могли бы проверить, действительно ли пользователь пытается стать «менеджером».

Недавно у меня была похожая проблема, когда валидации должны были отличаться в зависимости от состояния, в котором будет находиться конкретный экземпляр модели.Быть в. Посмотрите на gem state_machine (http://github.com/pluginaweek/state_machine), который обеспечивает поддержку. Возможно, это лучше подходит вашему сценарию.

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