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

Ruby on rails 为什么没有值的变量返回true时为空?在视图中使用时)?,ruby-on-rails,ruby,Ruby On Rails,Ruby,对于nil类,empty?方法未定义,因此当您在控制台中尝试nil.empty?时,它会给出:undefined method empty?对于零:零类 我在我的应用程序_helper.rb中创建了此方法: def full_title(page_title) base_title = "my app" if page_title.empty? base_title else "#{base_title} - #{page_title}".html_safe

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

我在我的应用程序_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”)
,用于将字符串传递给这个helper方法

但是当我不使用
provide(:title,“something”)
时,如果page\u title.empty?返回true,则看起来像


我的问题是为什么页面标题为空?返回true。当我不使用
提供(:title,“something”)
时,我认为page\u title变量是nil,它不会引起任何错误吗?例如未定义的
未定义的方法为空?对于nil:NilClass

如果有效,则表示变量
page\u title
不是
nil

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


提示:使用pry,您可以将
绑定。pry
放在
base\u title=“my app”
之后,如果您执行
操作,则会返回空字符串,因此可以在您的视图中连接它

如果我理解正确的话,你的代码现在就可以正常工作了<代码>页面标题
为空,对吗

相关的:

给定的链接解释的是,每次您为或提供内容时,它都会构建一个散列(例如,它实际上并不在乎如何真实地存储),并且当您执行时,它会为请求的符号查找内容片段。事实上,这就是你需要知道的全部。但它永远不会测试符号是否为空,而是测试它们是否具有给定符号的内容,如果没有,则返回一个空字符串

因此,示例实现类似于

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\u name
时,它都会有另一个数字。所以符号是一种非常可读的分配唯一数字的方法,因此总是用来在散列中存储和查找内容。因此,符号本身永远不会有内容,符号被用作在散列中查找内容的键

也许你想要这个礼物?方法?你永远不应该满足于仅仅“认为”你的变量是什么。只需跟踪或调试它,您肯定会知道页面标题是否为空?是否解决了您的问题?(如果没有,那就不是问题中的
.empty?
了,这就是问题所在)谢谢你tessi的所有回答:)我的困惑源于这个调用:full_title(yield(:title)),第一次我说full_title()取一个符号:title,如果我从我的视图中删除provide(:title,“my title”),逻辑上我的测试:如果page_title.empty?与:title.empty相同吗?结果是假的,但我希望是真的,因为在我的视图中没有提供(:title,“我的title”)!!我认为是yield纠正了这一点,并返回了一个空字符串,但它是如何工作的,我安装了pry gem,然后添加binding.pry在base_title=“我的应用程序”之后,正如你所说,我在控制台中有一个停止点,我正在尝试调试puts base_title-->it show me nil,当我只使用base_title时,它会显示我:“我们讨论的是
page\u title
,在pry调试会话中,只要键入
page\u title
,它就不应该为零(put总是返回nil,这是完全正常的,不需要在pry中使用它,除非你知道你在做什么)好的,当我键入page\u title时它返回“”,但我不明白为什么它是一个空字符串而不是零!这是我的问题可能是因为您调用了
full_title(“”
),但现在我们正在猜测,请打开另一个问题并提供更多详细信息。例如,当我在我的主页视图中添加以下行时:提供(:title,“主页标题”)->full_title(收益率(:title))在我的版面中检测是否有包含内容的标题“主页的标题”,它说ok,我将显示一个标题,但当我从我的主页视图中删除行:提供(:标题,“主页的标题”)时,它将搜索提供(:标题…)但是现在已经不存在提供的标题了,那么测试页面的标题是空的吗?谁说它测试提供的标题,然后发现它是空的呢?首先,我认为完整的标题(收益率(:标题))测试一个符号是谁的意思测试:title.empty?和:title.empty不是空的,但我现在明白了屈服方法做了一些验证,但我不明白如何通过你给mei的链接也感谢你的帮助,我不知道如何感谢你的解释:)对于你答案的最后一段,我知道什么是symbol,我理解它…我认为在rails中唯一的问题是理解一些内部方法和帮助程序,我发现大多数使用特性和东西的人甚至不知道它们是如何工作的。我希望有一天能更深入地理解rails^^。谢谢