gpt4 book ai didi

ruby-on-rails - 为什么一个没有值的变量会返回 true 和 empty?在 View 中使用时)?

转载 作者:太空宇宙 更新时间:2023-11-03 16:29:54 24 4
gpt4 key购买 nike

empty? 方法对于 nil 类是未定义的,所以当您在控制台中尝试 nil.empty? 时,它会给出:undefined method empty?对于零: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

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

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

我的问题是为什么page_title.empty?返回真。我认为当我不使用 provide(:title, "something") 时 page_title 变量为 nil,它不会引发任何错误吗?比如undefined undefined 方法为空?对于零:NilClass

最佳答案

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

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

相关:How does the yield magic work in ActionView?

给定的链接解释的是,每次您执行 content_forprovide 时,它都会构建一个散列(例如,它的存储方式并不重要real),当你执行 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 只是开源的,所以如果你真的想看它,它会更复杂一点,肯定是关于 block 处理。

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

关于ruby-on-rails - 为什么一个没有值的变量会返回 true 和 empty?在 View 中使用时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com