railstutorial 调试信息来自哪里
railstutorial where is debug information coming from
在第 7 章中,我使用
得到以下输出
--- !ruby/hash-with-ivars:ActionController::Parameters
elements:
controller: static_pages
action: home
ivars:
:@permitted: false
有人可以解释一下 hash-with-ivars 的来源以及什么是 ivars:
:@permitted: false 是什么意思?
有趣的问题!我在 rails 项目的所有库源中搜索了 'hash-with-ivars'
,只找到一个地方:psych
ruby library for (de-)serializing arbitrary objects to and from YAML. Specifically, these are links to the source code for reading and writing 这个 YAML 结构。
在 Rails 教程的 Chapter 7 中,此输出作为 debug(params)
命令的输出出现,您被指示放入模板中。 debug
命令显然调用了 psych
库来显示对象的可读表示(在本例中为 params
)。
现在,params
- 用于保存从 URL 或表单传递的参数的通用 Rails 数据结构 - 是一个行为类似于 Hash
但不是纯哈希的对象:它是 class ActionController::Parameters
的一个实例,它是 Hash
的 subclass,让我们看看 class definition:
module ActionController
# ...
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
end
end
而 HashWithIndifferentAccess
是 Hash
的直接子 class。
作为 Hash
的子class,params
对象可以保存哈希本身以外的其他数据,这就是 psych
在尝试打印时实际支持的内容可读形式的对象。除了打印所有散列元素(在 elements
键下),它还尝试列出对象的 所有实例变量 并在 ivars
键下打印它。
所以,总而言之,这个调试打印只是说被调试的对象是 ActionController::Parameters
class 的一个实例,它是 [=20= 的子 class ],除了它的哈希元素之外,还定义了一个 @permitted
实例变量,它当前设置为 false
。顺便说一句,controller
和 action
这两个元素是 Rails 内部用于路由的参数。
当你再次查看 class 的源代码时,你确实会在构造函数中找到 @permitted
变量:
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
def initialize(attributes = nil)
super(attributes)
@permitted = self.class.permit_all_parameters
end
end
最后,从documentation我们可以得出结论,@permitted
变量保存了params权限的状态。 IE。在使用 permit
方法允许参数后,它被设置为 true
:
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true
更新:为什么 Rails教程的调试输出不同
Rails教程中的调试输出有点不同 - 它不打印 ivar
s。为什么?这是因为在stdlib 2.3.0 preview1 version的version 2.0.9. The psych
gem is now a part of the Ruby standard library and this particular version of it has been added中的psych
gem添加了序列化hash-with-ivars
的特性。
所以,神秘的不同输出有一个简单的解释:Rails教程作者很可能在写这本书时使用 ruby 2.2 或更早版本,而这个 ruby 版本没有显示Hash
调试输出中的实例变量尚未。其实教程里有提示suggest作者用的是ruby2.1.5.
在第 7 章中,我使用
得到以下输出--- !ruby/hash-with-ivars:ActionController::Parameters
elements:
controller: static_pages
action: home
ivars:
:@permitted: false
有人可以解释一下 hash-with-ivars 的来源以及什么是 ivars: :@permitted: false 是什么意思?
有趣的问题!我在 rails 项目的所有库源中搜索了 'hash-with-ivars'
,只找到一个地方:psych
ruby library for (de-)serializing arbitrary objects to and from YAML. Specifically, these are links to the source code for reading and writing 这个 YAML 结构。
在 Rails 教程的 Chapter 7 中,此输出作为 debug(params)
命令的输出出现,您被指示放入模板中。 debug
命令显然调用了 psych
库来显示对象的可读表示(在本例中为 params
)。
现在,params
- 用于保存从 URL 或表单传递的参数的通用 Rails 数据结构 - 是一个行为类似于 Hash
但不是纯哈希的对象:它是 class ActionController::Parameters
的一个实例,它是 Hash
的 subclass,让我们看看 class definition:
module ActionController
# ...
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
end
end
而 HashWithIndifferentAccess
是 Hash
的直接子 class。
作为 Hash
的子class,params
对象可以保存哈希本身以外的其他数据,这就是 psych
在尝试打印时实际支持的内容可读形式的对象。除了打印所有散列元素(在 elements
键下),它还尝试列出对象的 所有实例变量 并在 ivars
键下打印它。
所以,总而言之,这个调试打印只是说被调试的对象是 ActionController::Parameters
class 的一个实例,它是 [=20= 的子 class ],除了它的哈希元素之外,还定义了一个 @permitted
实例变量,它当前设置为 false
。顺便说一句,controller
和 action
这两个元素是 Rails 内部用于路由的参数。
当你再次查看 class 的源代码时,你确实会在构造函数中找到 @permitted
变量:
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
def initialize(attributes = nil)
super(attributes)
@permitted = self.class.permit_all_parameters
end
end
最后,从documentation我们可以得出结论,@permitted
变量保存了params权限的状态。 IE。在使用 permit
方法允许参数后,它被设置为 true
:
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true
更新:为什么 Rails教程的调试输出不同
Rails教程中的调试输出有点不同 - 它不打印 ivar
s。为什么?这是因为在stdlib 2.3.0 preview1 version的version 2.0.9. The psych
gem is now a part of the Ruby standard library and this particular version of it has been added中的psych
gem添加了序列化hash-with-ivars
的特性。
所以,神秘的不同输出有一个简单的解释:Rails教程作者很可能在写这本书时使用 ruby 2.2 或更早版本,而这个 ruby 版本没有显示Hash
调试输出中的实例变量尚未。其实教程里有提示suggest作者用的是ruby2.1.5.