これはテストされていませんが、あなたが探しているものだと思います。
ルート:
resources :projects do
member do
post :set_current
end
end
これにより、次のようになります。
- エンドポイント:/ projects /:id / set_current POST
- ヘルパー:set_current_project_path
コントローラ
def set_current
project = Project.find(params[:id])
session[:project_id] = project.id
redirect_to projects_path, :notice => "Current project set to #{project.name}"
end
ビュー
# index / erb tags excluded for simplicity
@projects.each do |project|
link_to 'Select Project', set_current_project_path(project), :method => :post
end
# show
<%= link_to 'Select Project', set_current_project_path(@project), :method => :post %>
見る:
オブジェクト(セッション)の状態を変更するため、「get」の代わりに「post」を使用することにも注意してください。getではなくpostを使用することをお勧めします。そうしないと、ユーザーがアドレスバーに古いgetリクエストをプルする可能性があります。彼らのブラウザのそして彼らのセッションを無意識のうちにプロジェクトに設定しました。
言ったようにvaratis
-あなたのルート/パスヘルパーがどのように見えるか、そして彼らが期待しているhttp動詞を決定するのを助けるためにrake routes
またはを使用してくださいCONTROLLER=projects rake routes
そして、それがコントローラーの@projectではなくプロジェクトである理由があります
@projectはインスタンス変数を作成します。Railsコントローラーインスタンスでは、変数がビューで使用できるようになります。このset_currentアクションはビューをレンダリングしないため、ビューからインスタンス変数を作成する理由はありません。
ルートのコレクションではなく、メンバーに設定する必要があるのはなぜですか
参照するアクションはすべてparams[:id]
メンバールートである必要があります。代わりに、それをコレクションルートとして残しparams[:project_id]
、すべてのlink_to呼び出しでそれを渡して渡すこともできますが、この場合、メンバーの方が理にかなっています。
resources :projects
この内訳の近道だと思います
member do
get :show
get :edit
put :update
delete :destroy
end
collection do
get :index
get :new
post :create
end
うまくいけば、それはあなたの質問をいくつか明確にしますか?