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'的主要内容,如果未能解决你的问题,请参考以下文章