0

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に移行しました。

4

1 に答える 1

1

定義の名前を変更する必要があることは間違いありません。

class Event < ActiveRecord::Base
  state_machine :status, :initial => :active_offer do
  end

  def active_offer
    'Active Offer'
  end
end

編集:

私があなたを正しく理解している場合、私はそれを確信していませんが、これはうまくいくでしょう:

state_machine :status, initial: :active_offer do
  event :expire do
    transition all => :expired
  end
  event :cancel do
    transition all => :cancelled
  end
end

次に、コントローラーなどでステートメントなどを実行し、またはif...のようなものでそれらを遷移させることができます。自動化したい場合は、いつでものようなものが必要になります。@event.expireif @event.expired

于 2013-02-13T22:46:53.067 に答える