1

当我的视图文件中有这样的链接时,怎么会这样:

<%= 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]
4

2 回答 2

3

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

发生这种情况是因为在第一种形式中,您实际上是在方法接受的哈希中传递url& 。换句话说,您正在这样做:classoptions

<%= 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

于 2013-08-06T09:50:41.863 回答
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

于 2013-08-06T09:48:20.430 回答