19

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

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

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

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

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

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

defインデックス
    @recipe = params [:recipe_id]
    @user_recipes = UserRecipes.all#db内に複数のユーザーがいる場合に検索するように変更
    response_todo|フォーマット|
         format.html#index.html.erb
         format.xml {render:xml => @recipes}
    終わり
終わり

def create
    @user_recipe = UserRecipe.new
    @ user_recipe.recipe_id = params [:recipe_id]
    @ user_recipe.user_id = current_user
    response_todo|フォーマット|
      @menu_recipe.saveの場合
        format.html {redirect_to(r、:notice =>'メニューは正常に作成されました。')}
        format.xml {render:xml => @menu、:status =>:created、:location => @menu}
      そうしないと
        format.html {render:action => "new"}
        format.xml {render:xml => @ menu.errors、:status =>:unprocessable_entity}
      終わり
    終わり
4

2 に答える 2

42

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

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

于 2010-09-17T20:11:53.750 に答える
12

ルートファイルにデフォルトのリソースが設定されていると仮定します。つまり、次のようになります。

resources :recipes

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

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

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

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

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

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

于 2012-03-05T08:09:48.447 に答える