为什么Rails在锚元素的href
属性中创建当前页面的路径,而不是在我向link_to
方法传递与之无关的实例变量时引发异常任何资源(等于nil
)?
以下是一个例子:
路线
# 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。
答案 0 :(得分:2)
如果您查看link_to方法,则会使用url_for方法链接到网址。
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。
答案 1 :(得分:2)
我向DHH(Rails的创建者)提出了一个与传递nil, nil
参数时link_to行为密切相关的问题。我希望它根本不会呈现标签,而不是让我在调用之前检查nils。他慷慨地回答说:
https://twitter.com/dhh/status/198487578352156672
这个答案的实质适用于你的问题。递交nil
时需要做一些事情。 Gazler指出了技术上发生的事情,但DHH的回应显示出一些更高级别的“为什么?”采用nil参数时,url_for
方法很好,当前页面是合理的默认值。