web-dev-qa-db-ja.com

link_to:action => 'create'ではなくインデックスに移動します

RoRを学習するための非常に単純なレシピアプリを作成しており、ユーザーがフォームではなくリンクをクリックしてレシピを保存できるようにしようとしているため、link_toを介してuser_recipeコントローラーの「create」関数を接続しています。

残念ながら、何らかの理由で、link_toはcreateではなくindex関数を呼び出しています。

Link_toを次のように記述しました

 <%= "このレシピを保存"、:action => 'create'、:recipe_id => @recipe%> 

このリンクはuser_recipes/index.html.erbにあり、同じコントローラーの「作成」関数を呼び出しています。 :controllerを含めても、含めなくても違いはないようです。

コントローラは次のようになります

 def index 
 @ recipe = params [:recipe_id] 
 @ user_recipes = UserRecipes.all#db 
 respond_to do |に複数のユーザーがいる場合に検索するように変更format | 
 format.html#index.html.erb 
 format.xml {render:xml => @recipes} 
 end 
 end 
 
 def create 
 @ user_recipe = UserRecipe.new 
 @ user_recipe.recipe_id = params [:recipe_id] 
 @ user_recipe.user_id = current_user 
 respond_to do | format | 
 if @ menu_recipe.save 
 format.html {redirect_to(r、:notice => 'メニューが正常に作成されました。')} 
 format.xml {render :xml => @menu、:status =>:created、:location => @menu} 
 else 
 format.html {render:action => "new"} 
 format.xml {render:xml => @ menu.errors、:status =>:unprocessable_entity} 
 end 
 end 
18
pedalpete

標準のRESTスキームでは、インデックスアクションと作成アクションはどちらも同じURL(/recipes)を持ち、GETを使用してインデックスにアクセスし、POSTを使用して作成にアクセスする点のみが異なります。したがって、link_to :action => :createは単に/recipesへのリンクを生成します。これにより、ブラウザはクリックされたときに/recipesのGET要求を実行し、インデックスアクションを呼び出します。

作成アクションを呼び出すには、link_to {:action => :create}, :method => :postを使用して、link_toに投稿リクエストが必要であることを明示的に伝えるか、リンクではなく送信ボタンのあるフォームを使用します。

39
sepp2k

ルートファイルにデフォルトのリソースが設定されていると仮定します。

resources :recipes

以下は、レシピを作成するリンクを生成します。つまり、作成アクションにルーティングされます。

<%= link_to "Create Recipe", recipes_path, :method => :post %>

これを機能させるには、ブラウザでJSを有効にする必要があります。

以下は、すべてのレシピを表示するリンクを生成します。つまり、インデックスアクションにルーティングされます。

<%= link_to "All Recipes", recipes_path %>

これは、デフォルトのGetHTTPリクエストを想定しています。

11
Yusuf Saber