1

コントローラーに別のアクションを追加したかったのです。そこで、コントローラーでアクションを定義し、それをアクティブにするボタンを追加して、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 を使用しています

ありがとう

4

2 に答える 2