Rails проверяет ... несколько: на опции? - PullRequest
10 голосов
/ 30 октября 2011

Возможно ли иметь несколько записей для опции :on для validates проверка?

Что-то вроде следующего:

class Library < ActiveRecord::Base

  validates :presence => true, :on => [:create, :update, :some_other_action]

end

По сути, я хотел бы запустить одну конкретную проверку, когда несколько действия вызываются в контроллере. Например, я хотел бы проверить некоторую информацию пользователя о действии create, о действии update, и, возможно, некоторые другие действия.

Хотя я не хочу, чтобы проверка выполнялась на всех методах.

Кроме того, если есть более простой способ сделать это, это тоже было бы здорово!

Заранее спасибо!

Ответы [ 4 ]

9 голосов
/ 12 октября 2015

Да. Доступный в рельсах 4.1.

PR: https://github.com/rails/rails/pull/13754/files Официальный документ: http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate

Синтаксис: on: [:create, :custom_validation_context]

6 голосов
/ 30 октября 2011

Да для создания и обновления!

: on - указывает, когда эта проверка активна. Работает во всех контекстах проверки по умолчанию (ноль), другие параметры: : создать и : обновить

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

1 голос
/ 30 октября 2011

Это невозможно.Зачем?Эти :on события НЕ являются именами действий внутри контроллера, но являются предопределенными событиями ActiveRecord (MODEL), :create или :update или :save

Автоматическая связь между методами контроллера и методом модели отсутствует.

0 голосов
/ 29 января 2018

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

Это будет работать на ваше дело без проблем.

в модели

validates :password, presence: true, unless: :skip_password_validation

attr_accessor :skip_password_validation

и когда приходит ситуация, когда мне не нужна проверка, я просто делаю это в контроллере

@user = User.find(params[:id])
@user.skip_password_validation = true 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...