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

标签 ruby-on-rails ruby railstutorial.org

在第 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用于(反)序列化任意对象到YAML .具体来说,这些是 reading 的源代码链接。和 writing这个 YAML 结构。

Chapter 7在 Rails 教程中,此输出作为 debug(params) 命令的输出出现,您被指示放入模板中。 debug 命令显然调用了 psych 库来显示对象的可读表示(在本例中为 params)。

现在,params - 用于保存从 URL 或表单传递的参数的通用 Rails 数据结构 - 是一个行为类似于 Hash 但不是纯哈希的对象:它是 ActionController::Parameters 类的一个实例,它是 Hash子类,让我们看看 class definition :

module ActionController
  # ...
  class Parameters < ActiveSupport::HashWithIndifferentAccess
    # ...
  end
end

HashWithIndifferentAccessHash 的直接子类。

作为 Hash 的子类,params 对象可以保存哈希本身之外的其他数据,这正是 psych 在尝试时实际支持的以可读形式打印对象。除了打印所有哈希元素(在 elements 键下),它还尝试列出对象的所有实例变量,并将其打印在 ivars 键。

所以,总而言之,这个调试打印只是说被调试的对象是 ActionController::Parameters 类的实例,它是 Hash 的子类,除了它的哈希元素之外,还定义了一个 @permitted 实例变量,它当前设置为 false。顺便说一下,controlleraction 这两个元素是 Rails 内部用于路由的参数。

当您再次查看该类的源代码时,您确实会在构造函数中找到 @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

更新:为什么 RailsTutorial 的调试输出不同

RailsTutorial 的调试输出有点不同 - 它不打印 ivar。为什么?这是因为序列化 hash-with-ivars 的特性被添加到 psych gem 的 version 2.0.9 中。 . psych gem 现在是 Ruby 标准库的一部分,它的这个特定版本已被 added到 stdlib 2.3.0 preview1 版本

所以,神秘的不同输出有一个简单的解释:RailsTutorial 作者在写这本书时很可能使用了 ruby​​ 2.2 或更早版本,而这个 ruby​​ 版本还没有在 Hash 调试输出中显示实例变量.实际上,教程中有提示 suggest作者使用 ruby​​ 2.1.5。

关于ruby-on-rails - railstutorial 调试信息来自哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36655635/

相关文章:

javascript - 动态计算 form_for 字段中的余额 - Ruby on rails

ruby-on-rails - 头像不显示

ruby-on-rails-3 - 为什么在 Rails 中路由时使用 match 而不是 get?

ruby-on-rails - 嵌套模型、表单和 date_select FormHelper 集成

ruby-on-rails - 如何使用 devise_token_auth gem 进行社交登录?

ruby-on-rails - rails : Difference between 'in?' and 'include?' in Rails

jquery - 无法使用 Wicked PDF 渲染图表

ruby-on-rails - 如何为子文件夹中的对象提供服务

ruby-on-rails - Rails 教程第 7.4.4 章 Git 之后所有测试都失败

ruby-on-rails - 将参数发送到before_save