这是基于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表单提交更改状态的请求?
答案 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
请注意,我正在编写伪代码,但它应该或多或少有效。请原谅任何轻微的语法错误。