2011-05-07 382 views
1

爲什麼Rails會在anchor元素的屬性href中創建當前頁面的路徑,而不是在發送異常時向我的link_to方法傳遞與任何資源無關的實例變量(和等於nil)?Ruby on Rails。 link_to不會引發異常

下面是一個例子:

路線

# app/config/routes.rb 
Example::Application.routes.draw do 
    resource :example 
end 

HAML

-# app/views/examples/show.html.haml 
%div 
    = link_to 'Non-existent resource', @ne_resource 

HTML

<!-- http://localhost/example --> 
<div> 
    <a href="/example">Non-existent resource</a> 

謝謝。

Debian GNU/Linux 6.0.1;

Ruby 1.9.2;

Ruby on Rails 3.0.6。

回答

2

如果你看看link_to方法,它使用url_for方法鏈接到URL。

def link_to(*args, &block) 
    if block_given? 
     options  = args.first || {} 
     html_options = args.second 
     link_to(capture(&block), options, html_options) 
    else 
     name   = args[0] 
     options  = args[1] || {} 
     html_options = args[2] 

     html_options = convert_options_to_data_attributes(options, html_options) 
     url = url_for(options) #THIS GETS CALLED 

     href = html_options['href'] 
     tag_options = tag_options(html_options) 

     href_attr = "href=\"#{html_escape(url)}\"" unless href 
     "<a #{href_attr}#{tag_options}>#{html_escape(name || url)}</a>".html_safe 
    end 
    end 

網址爲

def url_for(options = {}) 
    options ||= {} 
    url = case options 
    when String 
     options 
    when Hash #THIS CASE IS TRUE 
     options = options.symbolize_keys.reverse_merge!(:only_path => options[:host].nil?) 
     super 
    when :back 
     controller.request.env["HTTP_REFERER"] || 'javascript:history.back()' 
    else 
     polymorphic_path(options) 
    end 

    url 
    end 

從上面可以看到,url_for是有效的,而不選擇或用nilClass,它的目的不是要引發異常。如果您在使用link_to時需要錯誤,請確保在上例中使用動態「路徑」輔助方法new_example_path。

2

當傳遞nil, nil參數時,我向DHH(Rails的創建者)詢問了有關link_to行爲的密切相關的問題。我希望它根本不會渲染標籤,而不是讓我在調用之前檢查nils。他親切地說:

https://twitter.com/dhh/status/198487578352156672

這個答案的本質適用於你的問題。當它交給nil時,它需要做些事情。 Gazler指出技術上發生了什麼,但是DHH的迴應顯示了一個更高層次的「爲什麼?」。 url_for方法沒有任何參數,當前頁面是一個合理的默認值。