pluginaweekのstate_machinegemを実装しています。問題をより簡単に理解できるように、コードをこれだけに絞り込みました。今のところ、ステータスが1つだけだとしましょう。
class Event < ActiveRecord::Base
state_machine :status, :initial => :active_offer do
end
def status
'Active Offer'
end
end
シードまたはブラウザを介して新しいイベントオブジェクトを作成するときに発生するエラーはです{: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に移行しました。