RESTful State Machine переход с Rails и государственный деятель Gem

Это продолжение, основанное на великолепных ответах в ресурсе RESTful для конечного автомата, и этот вопрос, вероятно, больше связан с остальным, чем конечный автомат

Я использую Gem Statesman в приложении Rails 4.2. У меня есть модель Service и связанная модель state_transitions, которая хранит переходы через Active Record.

Транзитный метод показан в Документах Государственного деятеля как таковой: Order.first.state_machine.transition_to!(:cancelled)

Я знаю, что это даже не близко

В моем случае у меня есть button_to 'ok', service_path, action: "#{service}.transition_to!(:received)"

В моей сервисной модели transition_to делегирован на конечный автомат

Как я могу отправить запрос на изменение состояния через форму button_to?

1 ответ

Решение

Я думаю, что вы путаете действия контроллера с действиями на моделях. На самом деле это должны быть две разные вещи - у вас должно быть действие контроллера, которое вы можете вызывать из представления, а затем внутри этого действия контроллера вы можете изменить свое состояние. Например:

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

Обратите внимание, что я пишу псевдокод с макушки головы, но он должен быть более или менее действительным. Пожалуйста, извините за любые незначительные синтаксические ошибки.

Другие вопросы по тегам