微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – railstutorial来自哪里的调试信息

在第7章中我得到以下输出
--- !ruby/hash-with-ivars:ActionController::Parameters
elements:
  controller: static_pages
  action: home
ivars:
  :@permitted: false

有人可以解释hash-if-ivars来自哪里以及什么ivars:
:@permitted:false是什么意思?

解决方法

有趣的问题!我搜索了“hash-with-ivars”的rails项目的所有库源,并且只有一个地方出现了: psych ruby library for(de)将任意对象序列化到和从 YAML开始.具体来说,这些是源代码链接 readingwriting这个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.

原文地址:https://www.jb51.cc/ruby/266754.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐