Rails - Как проверить поле, только если другое поле имеет определенное значение? - PullRequest
18 голосов
/ 13 января 2012

Я довольно новичок в Rails, и теперь я столкнулся с проблемой, которую не смог решить с моим другом Google:)

В моей форме у меня есть выбор с тремя значениями: Яблоко , Банан и Вишня . Если я выбираю Apple из выбора, я скрываю другое поле выбора и текстовое поле с некоторым Javascript, потому что, когда выбран Apple , нет необходимости заполнять эти два других поля больше.

Так что теперь у меня есть проблема с проверкой моей формы при ее отправке. Я нашел несколько похожих проблем, например, в случае Msgstr "Проверять только поле, если другое поле пустое."

Эта проблема была решена так:

validates_presence_of :mobile_number, :unless => :home_phone?

Итак, я только что попробовал первое, что пришло мне в голову:

validates_presence_of :state, :granted_at, :if => :type != 1

Но когда я запускаю его, я получаю эту ошибку:

undefined method `validate' for true:TrueClass

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

Ответы [ 4 ]

30 голосов
/ 13 января 2012

Поскольку это исполняемый код, вам нужно обернуть его в лямбду или объект Proc следующим образом:

validates_presence_of :state, :granted_at, :if => lambda { |o| o.type != 1 }

# alternatively:
..., :if => lambda { self.type != 1 }
..., :if => Proc.new { |o| o.type != 1 }
..., :if ->(o) { o.type != 1 }
24 голосов
/ 13 января 2012

Вы можете использовать if флаг и лямбду:

validates_presence_of :state, :granted_at, :if => lambda {self.type != 1}

Или просто создайте приватный метод:

validates_presence_of :state, :granted_at, :if => :valid_type?

private
def valid_type?
  type != 1
end
2 голосов
/ 04 августа 2014

, хотя вышеупомянутые способы являются лучшими практиками, но вы также можете сделать это просто так:

1 голос
/ 12 октября 2016

Опираясь на предыдущие ответы, вы также можете использовать более короткий синтаксис "стрелки"

validates :state, :granted_at, presence: true, if: ->(o) { o.type != 1 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...