--- !ruby/hash-with-ivars:ActionController::Parameters elements: controller: static_pages action: home ivars: :@permitted: false
有人可以解释hash-if-ivars来自哪里以及什么ivars:
:@permitted:false是什么意思?
解决方法
psych
ruby library for(de)将任意对象序列化到和从
YAML开始.具体来说,这些是源代码的链接
reading和
writing这个YAML结构.
在Rails教程的Chapter 7中,该输出作为您被指示放入模板的debug(params)命令的输出.调试命令显然调用psych库来显示对象的可读表示(在这种情况下为params).
现在,params – 保存从URL或表单传递的参数的通用Rails数据结构是一个像Hash一样的对象,但不是纯哈希:它是一个类ActionController :: Parameters的实例,它是Hash的一个子类,让我们见class definition:
module ActionController # ... class Parameters < ActiveSupport::HashWithIndifferentAccess # ... end end
而HashWithIndifferentAccess是Hash的直接子类.
作为哈希的子类,params对象可以容纳哈希本身以外的其他数据,这是psych在以可读的形式打印对象时实际支持的.除了打印所有哈希元素(在元素键下),它还尝试列出对象的所有实例变量,并将其打印在ivars键下.
所以,总而言之,这个调试打印简单地说,被调试的对象是ActionController :: Parameters类的一个实例,除了它的哈希元素之外,还有一个@permitted实例变量被定义,它目前是设置为false.顺便说一下,控制器和操作的两个要素是Rails内部使用的路由选择.
当您再次查看类的源代码时,确实会在构造函数中找到@permitted变量:
class Parameters < ActiveSupport::HashWithIndifferentAccess # ... def initialize(attributes = nil) super(attributes) @permitted = self.class.permit_all_parameters end end
最后,从documentation我们可以得出结论,@permitted变量保存params权限的状态.即在允许使用permit方法后,设置为true:
permitted = params.require(:person).permit(:name,:age) permitted.permitted? # this prints out the @permitted instance variable # => true
更新:为什么RailsTutorial的调试输出不同
RailsTutorial的调试输出有所不同 – 它不会打印ivars.为什么?这是因为将hash-with-ivars序列化的功能添加到其version 2.0.9中的psych gem中.psych gem现在是Ruby标准库的一部分,其特定版本已经是added到stdlib 2.3.0 preview1版.
所以,神秘不同的输出有一个简单的解释:RailsTutorial作者最有可能在编写本书时使用ruby 2.2或更早的版本,而这个ruby版本没有在Hash调试输出中显示实例变量.实际上,在教程中有提示suggest作者使用ruby 2.1.5.