0

カスタムアクションを使用してプロジェクトのIDをセッションに取り込むため、そのプロジェクトに関連する情報のみが他の領域に表示されます。プロジェクトコントローラーでカスタムアクションを作成しましたが、そのアクションを呼び出すためのビューでリンクを機能させるのに問題があります。「IDのないプロジェクトが見つかりませんでした」というエラーが表示されます。Railsは初めてです-おそらく簡単な質問だと思いますが、助けていただければ幸いです。ありがとうございます。

コードを表示:

<%= link_to 'Select Project', :action => :select_project %>

コントローラーコード:

def select_project
  @project = Project.find(params[:id])
  session[:project_id] = @project.id
end

ルート:

resources :projects do
  collection do
    get :select_project
  end
end

代替ルートコード:

resources :projects do
  put 'select_project', on: :member
end
4

2 に答える 2

1

生成されるルートはだと思いますselect_project_projects_path

リンク:

<%= link_to 'Select Project', select_project_projects_path %>

今後の参考のためrake routesに、Railsによって生成された自動ルートヘルパーを確認するために実行します。

于 2012-06-30T17:03:33.823 に答える
1

これはテストされていませんが、あなたが探しているものだと思います。

ルート:

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

うまくいけば、それはあなたの質問をいくつか明確にしますか?

于 2012-07-01T15:25:19.537 に答える