Я использую 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
обратном вызове?И если да, то как я могу получить ошибки проверки для отображения в атрибуте виртуального имени аэропорта?