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 }