Я реализую гем state_machine от pluginaweek. Я сузил код только до этого, чтобы мне было легче понять проблему. Предположим, у меня пока только один статус:
class Event < ActiveRecord::Base
state_machine :status, :initial => :active_offer do
end
def status
'Active Offer'
end
end
Ошибка, которую я получаю при создании новых объектов Event либо с помощью заполнения, либо через браузер: {:status=>["is invalid"]}
.
План состоит в том, чтобы включить условие для всех различных статусов и вернуть пользовательскую строку в представление. Представления всего проекта в настоящее время используют синтаксис .status
, поэтому я пытаюсь плавно установить его. Я начал это решение на основе чтения документов API:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Overwriting+default+accessors
Это моя основная цель:
def status
if read_attribute(:status) == 'active_offer' && self.start_date > Time.now
'Active Offer'
elsif read_attribute(:status) == 'active_offer' && self.start_date < Time.now
'Expired'
else read_attribute(:status) == 'cancelled'
'Cancelled'
end
end
Что я могу сделать, чтобы блок state_machine использовал обычный метод доступа, чтобы получить значение базы данных?
РЕШЕНИЕ "СЕРЕБРЯНАЯ ПУЛЯ":
Моя главная проблема заключалась в переопределении аксессора status
. Когда код state_machine выполнялся, он считывал текущий статус с помощью переопределения моего метода доступа и, следовательно, возвращал пользовательскую строку, которая была недопустимым статусом. Мне пришлось заставить state_machine использовать :state. Первоначально я этого не делал, потому что у меня уже был атрибут :state для провинций и тому подобного, поэтому я перенес его в :address_state.