Ruby on rails railstutorial调试信息来自哪里
在第7章中,我得到了以下输出Ruby on rails railstutorial调试信息来自哪里,ruby-on-rails,ruby,railstutorial.org,Ruby On Rails,Ruby,Railstutorial.org,在第7章中,我得到了以下输出 --- !ruby/hash-with-ivars:ActionController::Parameters elements: controller: static_pages action: home ivars: :@permitted: false 有人能解释一下带ivar的哈希来自何处以及ivar是什么: :@allowed:false意味着什么?有趣的问题!我在rails项目的所有库源中搜索了“hash-with-ivars”,只找到了一个
--- !ruby/hash-with-ivars:ActionController::Parameters
elements:
controller: static_pages
action: home
ivars:
:@permitted: false
有人能解释一下带ivar的哈希来自何处以及ivar是什么:
:@allowed:false意味着什么?有趣的问题!我在rails项目的所有库源中搜索了
“hash-with-ivars”
,只找到了一个地方:用于将任意对象与之进行(反)序列化。具体地说,这些是指向和此YAML结构的源代码的链接
在Rails教程的第二部分中,此输出作为debug(params)
命令的输出,您被指示将其放入模板中。debug
命令显然调用了psych
库来显示对象的可读表示(在本例中为params
)
现在,params
——保存从URL或表单传递的参数的通用Rails数据结构——是一个行为类似于Hash
但不是纯Hash的对象:它是类ActionController::parameters
的实例,它是Hash
的子类,让我们看看:
最后,从中我们可以得出结论,@allowed
变量保存params权限的状态。即,在使用permit
方法允许参数后,将其设置为true
:
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true
更新:为什么Railstorial的调试输出不同
RailsTutorial上的调试输出略有不同-它不打印ivar
s。为什么?这是因为在its的psych
gem中添加了使用ivars序列化哈希的功能。psych
gem现在是Ruby标准库的一部分,它的这个特定版本已经发布到stdlib 2.3.0 preview1版本
因此,这个神秘不同的输出有一个简单的解释:RailsTutorial的作者在写这本书时很可能使用了ruby 2.2或更早版本,而这个ruby版本还没有在Hash
debug输出中显示实例变量。实际上,教程中有一些提示,作者使用了ruby 2.1.5。在静态页面#主页中是否允许@allowed任何实例变量?控制器或html中不允许@allowed。我已经检查了我创建的每个文件,但找不到它。@DCR对此有解决方案吗?我正在考虑尝试对参数进行无所谓的访问,因为我没有想法&其中30+个SO的答案中没有一个是我的问题阅读检查答案这是一个很好的答案,但为什么教程的示例输出不匹配?我和作者谈过了,他无法解释发生了什么。我需要等8个小时才能给你发赏金。谢谢你的帮助。这是直接的团队合作,也是社区S.O.对编码世界至关重要的原因。
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
def initialize(attributes = nil)
super(attributes)
@permitted = self.class.permit_all_parameters
end
end
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true