加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:50:26 所属栏目:百科 来源:网络整理
导读:在第7章中我得到以下输出 --- !ruby/hash-with-ivars:ActionController::Parameterselements: controller: static_pages action: homeivars: :@permitted: false 有人可以解释hash-if-ivars来自哪里以及什么ivars: :@permitted:false是什么意思? 解决方
在第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开始.具体来说,这些是源代码的链接 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读