Применить модуль проверки к модели только в определенных контроллерах

У меня есть модель, которую могут редактировать два разных типа пользователей. Первый имеет логин и особые привилегии (назовем их «пользователь»). Второй — это просто какой-то случайный пользователь без логина с ограниченными привилегиями (назовем его «гость»).

Гость действительно взаимодействует с моделью только через один контроллер, и мы хотим, чтобы определенные проверки применялись только в этом случае. Валидации, которые мы хотим применить, существуют внутри модуля.

Я попытался сделать что-то подобное в действии контроллера, но, похоже, это не сработало:

@object = Model.find(params[:object_id])
@object.extend SpecialValidations

Затем мы проверяли бы валидность объектов (может быть, напрямую или при обновлении атрибутов), а затем отображали бы все ошибки, сгенерированные проверками.

Есть лучший способ сделать это?

Спасибо!


person Chris Butler    schedule 08.06.2012    source источник


Ответы (2)


Одним из вариантов является включение в модель следующего:

attr_accessor :guest

def run_special_validations?
    guest
end

validate :special_validation1, if: run_special_validations?
validate :special_validation2, if: run_special_validations?

Затем, установив в контроллере значение @object.guest = true, вы скажете объекту выполнить условную проверку.

person cdesrosiers    schedule 08.06.2012

Вы можете оставить проверку без каких-либо условий и просто пропустить ее в контроллере user (например, используя метод update_attribute).

person Henrique Zambon    schedule 09.06.2012