Проверка виртуальных атрибутов в Ruby on Rails - PullRequest
7 голосов
/ 17 марта 2012

Я использую Ruby (1.9.3) на Rails (3.2.0) и у меня проблема с проверкой виртуальных атрибутов.

У меня есть модель Flight, которая представляет полет, который, средидругие, имеют атрибуты, представляющие аэропорт вылета и прилета.

Поскольку select для выбора аэропорта потенциально огромен, я решил использовать решение с автозаполнением, которое прекрасно работает.Я использую обратный вызов before_validation для правильного заполнения действительного идентификатора аэропорта:

before_validation do
  self.departure_airport = Airport.find_by_long_name(departure_airport_name)
  self.arrival_airport = Airport.find_by_long_name(arrival_airport_name)
end

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

validates :departure_airport, :arrival_airport presence: true

attr_accessor :departure_airport_name, :arrival_airport_name

<%= f.input :departure_airport_name %>
<%= f.input :arrival_airport_name %>

Это даже способ правильно изменить имяаэропорт в идентификационный номер в before_validation обратном вызове?И если да, то как я могу получить ошибки проверки для отображения в атрибуте виртуального имени аэропорта?

1 Ответ

4 голосов
/ 17 марта 2012

Я думаю, что вы идете правильным путем с обратным вызовом before_validation.

Вы можете проверять виртуальные атрибуты, как и любой обычный атрибут.Так что все, что вам нужно, это просто некоторая проверка в модели.Попробуйте это:

validates :departure_airport, presence: true
validates :arrival_airport, presence: true

это должно добавить ошибку к ошибкам объектов, и ошибка должна отображаться в вашей форме ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...