Rails - Как проверить поле только в том случае, если другое поле имеет определенное значение?
Я новичок в Rails, и теперь у меня возникла проблема, которую я не смог решить с моим другом Google:)
В моей форме у меня есть выбор с тремя значениями: Apple, Банана и Черри. Если я выберу Apple из выбранного, я скрою еще одно поле Select- и Text-поле с некоторым Javascript, потому что, когда выбрано Apple, нет необходимости заполнять эти другие два поля больше.
Итак, теперь у меня возникла проблема с проверкой моей формы при ее отправке.
Я нашел некоторые подобные проблемы, например, в случае
"Проверять только поле, если другое пустое."
Эта проблема была решена следующим образом:
validates_presence_of :mobile_number, :unless => :home_phone?
Итак, я только что попробовал первое, что появилось у меня в голове:
validates_presence_of :state, :granted_at, :if => :type != 1
Но когда я запускаю его, я получаю эту ошибку:
undefined method `validate' for true:TrueClass
Итак, теперь я не узнал, как я могу получить доступ к значениям из объекта, который был создан...
Благодарим вас в Advance за вашу помощь, и я надеюсь, что мой вопрос не так очевиден, как кажется: -)
Ответы
Ответ 1
Поскольку это исполняемый код, вы должны обернуть его в лямбда или объект 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 }
Ответ 2
Вы можете использовать флаг 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
Ответ 3
хотя вышеупомянутые способы - это лучшие практики, но вы также можете сделать это простым:
validates_presence_of :state, :granted_at, :if => "type!=1"
Ответ 4
Основываясь на предыдущих ответах, вы также можете использовать более короткий синтаксис "стрелка"
validates :state, :granted_at, presence: true, if: ->(o) { o.type != 1 }