当我的视图文件中有一个这样的链接时,为什么会出现这样的链接:
<%= link_to image_tag("foo.png"), :url => new_foo_path, :class => "banner-image" %>
生成的标记会生成无效的定位标记,如下所示:
<a href="/home/index?class=banner-image&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>
My routes.rb 包含以下行 foo:
resources :foo, only: [:new, :create]
查看源代码:https://github.com/rails/rails/blob/797fcdf738a2a2772544731027d4fc5ca9d358bc/actionpack/lib/action_view/helpers/url_helper.rb#L174
发生这种情况是因为在第一种形式中,您实际上是在该方法接受的options
哈希中传递url
和class
。换句话说,您正在这样做:
<%= 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
哈希传递。
您可以直接在link_to
中使用new_foo_path
。无需为其添加:url =>
。
<%= link_to your-text-or-image-tag, your-path %>
欲了解更多信息,请查看 http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to 的链接。