2

empty?方法对于 nil 类是未定义的,因此当您nil.empty?在控制台中尝试时,它会给出:undefined method empty? for nil:NilClass

我在 application_helper.rb 中创建了这个方法:

def full_title(page_title)
   base_title = "my app"
   if page_title.empty?
     base_title
   else
     "#{base_title} - #{page_title}".html_safe
    end
end

在我的应用程序布局中,我在标题标签上调用它,如下所示:

!!!
%html
  %head
    %title #{full_title(yield(:title))}
    ...
    ...
  %body
    = yield

在我的每个视图中,我都添加provide(:title, "something")了将字符串传递给此辅助方法的内容。

但是当我不使用它时provide(:title, "something"),它看起来像page_title.empty?返回真!

我的问题是为什么 page_title.empty?返回真。我认为 page_title 变量在我不使用时为零provide(:title, "something"),它不会引发任何错误吗?比如未定义undefined method empty? for nil:NilClass

4

2 回答 2

1

如果您这样做yield :title并且没有提供任何内容,它将返回一个空字符串,因此可以在您的视图中将其连接起来。

如果我理解正确,您的代码就像现在一样工作。pagetitle 空的,对吧?

相关:ActionView 中的 yield 魔法是如何工作的?

给定链接的解释是,每次您执行此操作时content_forprovide它都会构建一个哈希(例如,它的真实存储方式并不重要),并且当您执行此操作时yield,它将查找所请求符号的内容. 事实上,这就是你需要知道的一切。但是它永远不会测试符号是否为空,而是会测试它们是否有给定符号的内容,如果没有,则返回一个空字符串。

所以一个示例实现就像

def provide(symbol, args=nil, &block)
  @content_for[symbol.to_sym] = args
  @content_for[symbol.to_sym] ||= capture(yield)
end

并且查找看起来像

def yield(symbol)
  @content_for[symbol].to_s
end

并且nil.to_s只是一个空字符串。

现在 rails 是开源的,所以如果你真的想要,你可以去查一下,它会稍微复杂一些,肯定是关于块处理的。

现在符号可能很难理解。符号是一个字符串,它得到一个唯一的数字。所以每次你写:name它都会有相同的数字(比如1),每次你写:first_name它都会有另一个数字。所以符号是分配唯一数字的一种非常易读的方式,因此总是用于在哈希中存储和查找内容。因此,符号本身永远不会有内容,符号被用作在哈希中查找内容的键。

于 2013-07-25T12:51:40.330 回答
0

如果有效,则意味着您的变量page_title不是nil.

在调试模式下测试它并报告你的发现:)

提示:使用 pry 可以binding.pry放在base_title = "my app".

于 2013-07-24T19:13:23.153 回答