Rails之间的不同行为:url vs url_for({:controller:,:action})

时间:2013-08-06 09:43:05

标签: ruby-on-rails

为什么我在我的视图文件中有这样的链接:

<%= link_to image_tag("foo.png"), :url => new_foo_path, :class => "banner-image" %>

生成的标记会生成一个无效的锚标记,如下所示:

<a href="/home/index?class=banner-image&amp;url=http%3A%2F%2Flocalhost%3A3000%2Ffoo%2Fnew"><img alt="foo" src="/assets/foo.png"></a>

但如果我这样做:

<%= link_to image_tag("foo.png"), url_for({:controller => "foo", :action => "new"}), :class => "banner-image" %>

它完美无缺 - 产生了这个:

<a href="/foo/new" class="banner-image"><img alt="foo" src="/assets/foo.png"></a>

我的routes.rb包含foo的这一行:

resources :foo, only: [:new, :create]

2 个答案:

答案 0 :(得分:3)

查看源代码:https://github.com/rails/rails/blob/797fcdf738a2a2772544731027d4fc5ca9d358bc/actionpack/lib/action_view/helpers/url_helper.rb#L174

这是因为在第一种形式中你基本上是通过了url&amp;方法接受的class哈希值中的options。换句话说,你这样做:

<%= link_to image_tag("foo.png"), { :url => new_foo_path, :class => "banner-image" } %>

options哈希中传递其他键值会将它们作为URL参数添加到最终查询字符串中,从而在第一个代码段中生成标记。

但你想要做的是:

<%= link_to image_tag("foo.png"), { :url => new_foo_path }, { :class => "banner-image" } %>

将第一个哈希值作为options哈希值传递,第二个哈希值作为html_options哈希值传递。

然而正如其他人所说,你可以这样做:

<%= link_to image_tag("foo.png"), new_foo_path, :class => "banner-image" %>

new_foo_path中的值作为:url{ :class => 'banner-image' }传递为html_options哈希值。

答案 1 :(得分:2)

您可以直接在new_foo_path中使用link_to。无需为其添加:url =>

<%= link_to your-text-or-image-tag, your-path %>

如需了解更多信息,请查看链接http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to

相关问题