コントローラーに別のアクションを追加したかったのです。そこで、コントローラーでアクションを定義し、それをアクティブにするボタンを追加して、routes.rb に追加しました。
orders_controller.rb
...
def shipped
...
end
...
ルート.rb
resources :orders do
put :shipped, on: :member
end
...
ビュー/注文/edit.html.rb
...
<%= button_to 'Ship', order_shipped_path, method: :put %>
...
ただし、/orders/1/edit を表示しようとすると、次のエラーが発生しました。
No route matches {:action=>"shipped", :controller=>"orders"}
rake routes により、次の出力が得られました。
shipped_order PUT /orders/:id/shipped(.:format) orders#shipped
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
new_order GET /orders/new(.:format) orders#new
edit_order GET /orders/:id/edit(.:format) orders#edit
order GET /orders/:id(.:format) orders#show
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy
...
パスヘルパーとルートに関する情報を検索して見つけようとした後、次の代替構文が見つかりました。
<%= button_to 'Ship', [:shipped, @order], method: :put %>
問題は、なぜ代替構文が機能したのかということです。舞台裏で何が起こっているのですか?余談ですが、これはルートにアクションを追加する正しい方法ですか?
関連する場合は、Ruby on Rails 3.2 を使用しています
ありがとう