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

RESTful State Machine transition with Rails and Statesman Gem

这是基于 RESTful resource for a State Machine 中的出色答案的跟进,这个问题可能比状态机

更与休息相关

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

Statesman 文档中显示了一种转换方法:Order.first.state_machine.transition_to!(:cancelled)

我知道这还差得远

在我的例子中,我有 button_to 'ok', service_path, action: "#{service}.transition_to!(:received)"

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

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

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

routes.rb

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

订单控制器

...
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

请注意,我是凭空编写伪代码,但它应该或多或少是有效的。请原谅任何小的语法错误。