8

すべての属性を更新したいが、ワークフロー/ AAASコールバックを適切に起動する必要がある場合は、コントローラーでワークフローまたはAASMgemをどのように使用するかを知りたいです。

現在、私はそれを次のように使用しています:

  class ModelController < ApplicationController
    def update
      @model = model.find(params[:id])

      if params[:application]['state'].present?
        if params[:application]['state'] == "published"
          @model.publish!
        end
      end
      if @model.update_attributes(params[:application]); ... end
    end
  end

それは正しくないと感じます、より良い解決策は何でしょうか?

4

4 に答える 4

4

私は通常、ある状態から別の状態への遷移を処理し、明示的な名前を持つ複数のアクションを定義します。あなたの場合、publishアクションを追加することをお勧めします:

def publish
  # as the comment below states: your action 
  # will have to do some error catching and possibly
  # redirecting; this goes only to illustrate my point
  @story = Story.find(params[:id])
  if @story.may_publish?
    @story.publish!
  else
   # Throw an error as transition is not legal
  end
end

あなたの中でそれを宣言してくださいroutes.rb

resources :stories do
  member do
    put :publish
  end
end

これで、ルートはストーリーに何が起こるかを正確に反映します。/stories/1234/publish

于 2011-07-05T11:51:27.893 に答える
0

更新後にモデルが新しい状態を返すようにしたかったのですが、これは、コントローラーに多くの「脂肪」を使用せずにこれを行うと考えられる最も簡単な方法であり、ワークフローが変更された場合に先に進むのが簡単になります。

class Article < ActiveRecord::Base
  include Workflow
  attr_accessible :workflow_state, :workflow_event # etc
  validates_inclusion_of :workflow_event, in: %w(submit approve reject), allow_nil: true
  after_validation :send_workflow_event

  def workflow_event
    @workflow_event
  end

  def workflow_event=(workflow_event)
    @workflow_event = workflow_event
  end

  # this method should be private, normally, but I wanted to 
  # group the meaningful code together for this example
  def send_workflow_event
    if @workflow_event && self.send("can_#{@workflow_event}?")
      self.send("#{@worklow_event}!")
    end
  end

  # I pulled this from the workflow website, to use that example instead.
  workflow do
    state :new do
      event :submit, :transitions_to => :awaiting_review
    end
    state :awaiting_review do
      event :review, :transitions_to => :being_reviewed
    end
    state :being_reviewed do
      event :accept, :transitions_to => :accepted
      event :reject, :transitions_to => :rejected
    end
    state :accepted
    state :rejected
  end
end
于 2013-01-22T08:59:16.260 に答える
0

それは小さなことですが、存在しない場合はハッシュが nil を返すので、present の呼び出しを削除できますか?

もちろん、それはあなたが求めていることではないことはわかっています。1 つの代替方法は、モデルに before フィルターを配置し、そこでステータスをチェックすることです。これにより、コントローラーはステータスの基になるストレージを認識できなくなります。

余談ですが、ここでは AASM を使用していますが、とても気に入っています :)

于 2011-07-05T11:51:01.073 に答える