为什么没有值的变量返回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_for
或provide
它都会构建一个哈希值(例如,它实际存储的方式并不重要),当你确实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"
。