2013-08-06 55 views
1

爲什麼當我有這樣的,我認爲文件的鏈接:軌之間不同的行爲:網址VS url_for({:控制器:,:動作})

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

如果我記得你不需要在你的第一個例子中傳遞:url參數。 '<%= link_to image_tag(「foo.png」),new_foo_path,:class =>「banner-image」%>'應該可以工作 –

回答

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哈希傳遞其他鍵值將追加他們在最後的查詢字符串網址參數,從而在你的第一個片段所產生的標記。

但是你要什麼做的其實是:

<%= 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哈希值。