19

我正在构建一个相当简单的食谱应用程序来学习 RoR,并且我试图允许用户通过单击链接而不是通过表单来保存食谱,因此我通过 link_to 连接 user_recipe 控制器的“创建”功能。

不幸的是,由于某种原因,link_to 调用的是 index 函数而不是 create。

我已将 link_to 写为

<%= "保存这个食谱", :action => 'create', :recipe_id => @recipe %>

此链接位于 user_recipes/index.html.erb 上,并正在调用同一控制器的“创建”功能。如果我包含 :controller 似乎没有什么区别。

控制器看起来像这样

定义索引
    @recipe = 参数[:recipe_id]
    @user_recipes = UserRecipes.all # 更改以查找 db 中何时有多个用户
    respond_to 做 |格式|
         format.html #index.html.erb
         format.xml { 渲染 :xml => @recipes }
    结尾
结尾

定义创建
    @user_recipe = UserRecipe.new
    @user_recipe.recipe_id = 参数[:recipe_id]
    @user_recipe.user_id = current_user
    respond_to 做 |格式|
      如果@menu_recipe.save
        format.html { redirect_to(r, :notice => '菜单已成功创建。') }
        format.xml { 渲染 :xml => @menu, :status => :created, :location => @menu }
      别的
        format.html { 渲染 :action => "new" }
        format.xml { 渲染 :xml => @menu.errors, :status => :unprocessable_entity }
      结尾
    结尾
4

2 回答 2

42

在标准的 REST 方案中,索引操作和创建操作都具有相同的 url ( /recipes),不同之处仅在于使用 GET 访问索引和使用 POST 访问创建。所以link_to :action => :create将简单地生成一个链接,/recipes该链接将导致浏览器在单击时执行 GET 请求/recipes,从而调用索引操作。

要调用 create 操作link_to {:action => :create}, :method => :postlink_to请明确告知您需要发布请求,或者使用带有提交按钮而不是链接的表单。

于 2010-09-17T20:11:53.750 回答
12

假设您在路由文件中设置了默认资源,即类似这样

resources :recipes

以下将生成一个链接,该链接将创建一个配方;ie 将被路由到创建操作。

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

为此,需要在浏览器中启用 JS。

以下将生成一个显示所有食谱的链接;即将被路由到索引操作。

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

这假定默认值为 Get HTTP 请求。

于 2012-03-05T08:09:48.447 回答