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
请注意,我是凭空编写伪代码,但它应该或多或少是有效的。请原谅任何小的语法错误。
这是基于 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
请注意,我是凭空编写伪代码,但它应该或多或少是有效的。请原谅任何小的语法错误。