Ruby on Rails。 link_to不会引发异常

时间:2011-05-07 08:57:12

标签: ruby-on-rails helpers

为什么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。

2 个答案:

答案 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方法很好,当前页面是合理的默认值。