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
標準のRESTスキームでは、インデックスアクションと作成アクションはどちらも同じURL(/recipes
)を持ち、GETを使用してインデックスにアクセスし、POSTを使用して作成にアクセスする点のみが異なります。したがって、link_to :action => :create
は単に/recipes
へのリンクを生成します。これにより、ブラウザはクリックされたときに/recipes
のGET要求を実行し、インデックスアクションを呼び出します。
作成アクションを呼び出すには、link_to {:action => :create}, :method => :post
を使用して、link_to
に投稿リクエストが必要であることを明示的に伝えるか、リンクではなく送信ボタンのあるフォームを使用します。
ルートファイルにデフォルトのリソースが設定されていると仮定します。
resources :recipes
以下は、レシピを作成するリンクを生成します。つまり、作成アクションにルーティングされます。
<%= link_to "Create Recipe", recipes_path, :method => :post %>
これを機能させるには、ブラウザでJSを有効にする必要があります。
以下は、すべてのレシピを表示するリンクを生成します。つまり、インデックスアクションにルーティングされます。
<%= link_to "All Recipes", recipes_path %>
これは、デフォルトのGetHTTPリクエストを想定しています。