使用Rails和Statesman Gem进行RESTful状态机转换

时间:2015-01-25 23:49:05

标签: ruby-on-rails rest state-machine

这是基于RESTful resource for a State Machine中的大答案的后续跟进,这个问题可能比状态机更多地与其相关

我在Rails 4.2 App中使用Statesman Gem。我有一个服务模型和一个关联的state_transitions模型,它通过Active Record存储转换。

在Statesman Docs中显示了一种过渡方法:Order.first.state_machine.transition_to!(:cancelled)

我知道这甚至不是很接近

就我而言,我有button_to 'ok', service_path, action: "#{service}.transition_to!(:received)"

在我的服务模型中,transition_to被委托给状态机

如何通过我的button_to表单提交更改状态的请求?

1 个答案:

答案 0 :(得分:3)

我认为您将控制器操作与模型上的操作混淆。它们应该是两个独立的东西 - 你应该有一个可以从视图中调用的控制器动作,然后在该控制器动作中,你可以进行状态改变。例如:

的routes.rb

resources :orders do
  member do
    put "receive" => "orders#receive", as: :receive
  end
end

OrdersController

...
def receive
  order = Order.find(params[:id])
  if order.state_machine.transition_to!(:received)
    flash[:notice] = "Success"
    redirect_to action: :show, id: order.id
  else
    flash[:error] = "Could not transition to 'received'"
    render action: :show, id: order.id
  end
end
...

view.rb

...
= button_to "Mark as received", receive_order_path(order), method: :put

请注意,我正在编写伪代码,但它应该或多或少有效。请原谅任何轻微的语法错误。