为什么没有值的变量返回true为空? 在视图中使用时)?

empty? 对于nil类,方法是未定义的,所以当你尝试nil.empty? 它在控制台中给出: undefined method empty? for nil:NilClass 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? 返回true!

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

如果你确实yield :title并且没有提供任何东西,它将返回一个空字符串,因此它可以在你的视图中连接起来。

如果我理解正确,你的代码就像现在一样。 pagetitle 空的,对吗?

相关: 在ActionView中,yield magic如何工作?

给定链接解释的是,每次执行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它将有另一个数字。 因此,符号是一种非常易读的分配唯一数字的方式,因此总是习惯于在哈希中存储和查找内容。 所以它永远不是具有内容的符号本身,该符号被用作在哈希中查找内容的键。

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

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

提示:使用base_title = "my app"你可以在base_title = "my app"之后base_title = "my app"