【问题标题】:Ruby on Rails. link_to doesn't raise an exceptionRuby on Rails。 link_to 不会引发异常
【发布时间】:2012-05-15 14:03:28
【问题描述】:

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

红宝石 1.9.2;

Ruby on Rails 3.0.6。

【问题讨论】:

    标签: ruby-on-rails helpers


    【解决方案1】:

    如果您查看 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】:

      我向 DHH(Rails 的创建者)询问了一个与 link_to 在传递 nil, nil 参数时的行为密切相关的问题。我希望它根本不会渲染标签,而不是让我在调用它之前检查 nils。他客气地回答:

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

      此答案的精髓适用于您的问题。当它收到nil 时,它需要做一些事情。 Gazler 指出了技术上正在发生的事情,但 DHH 的回应显示了更高层次的“为什么?” url_for 方法可以使用 nil 参数,当前页面是合理的默认值。









      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多