link_to :action => 'create' 去索引而不是 'create'

Posted

技术标签:

【中文标题】link_to :action => \'create\' 去索引而不是 \'create\'【英文标题】:link_to :action => 'create' going to index rather than 'create'link_to :action => 'create' 去索引而不是 'create' 【发布时间】:2011-04-13 21:45:30 【问题描述】:

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

不幸的是,由于某种原因,link_to 调用的是索引函数而不是创建函数。

我把link_to写成

'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 结尾 结尾

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢 Sepp2k,不仅提供了答案,还如此清楚地解释了原因。我真的很难理解为什么 Rails 会做或期望某些位,而且网上的答案通常只会给出“这就是它的完成方式”而没有给出原因。你的答案很完美! link_to :action => :create, :method => :post 创建一个带有data-method="POST" 属性的链接。 rails javascript使用它来创建一个离散的表单并发布它。链接本身不能用于发送 GET 请求以外的任何内容,这是 JS 失败时发生的情况。【参考方案2】:

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

resources :recipes

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

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

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

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

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

这假定默认为 Get HTTP 请求。

【讨论】:

以上是关于link_to :action => 'create' 去索引而不是 'create'的主要内容,如果未能解决你的问题,请参考以下文章

在rails中带有jquery参数的link_to

routes.rb和link_to的一些规则

如何在 Slim 中的 <p> 中插入文本和 link_to

无法理解Play中Action方法的语法

如何将“link_to”放在整张卡片下?

如何创建下载链接