Ruby on rails 在Ruby中,如何验证结构的标识?
我一直在试图理解Ryan Bates在他的演讲者RailsCast()中使用的Ruby on rails 在Ruby中,如何验证结构的标识?,ruby-on-rails,ruby,struct,self,presenter,Ruby On Rails,Ruby,Struct,Self,Presenter,我一直在试图理解Ryan Bates在他的演讲者RailsCast()中使用的present方法中的self。在视频中,Ryan说,“Self是一个模板对象,它拥有我们想要访问的所有帮助器方法”,但我想知道这个对象的类。在阅读了一系列博客文章、threads和Ruby文档之后,我开始认为self是一种结构,但我不知道如何确认这个概念 我的问题是:1)在下面的present方法中,selfa?和2)如何验证某个东西是结构 module ApplicationHelper def present
present
方法中的self
。在视频中,Ryan说,“Self是一个模板对象,它拥有我们想要访问的所有帮助器方法”,但我想知道这个对象的类。在阅读了一系列博客文章、threads和Ruby文档之后,我开始认为self
是一种结构,但我不知道如何确认这个概念
我的问题是:1)在下面的present
方法中,self
a?和2)如何验证某个东西是结构
module ApplicationHelper
def present(object, klass = nil)
klass ||= "#{object.class}Presenter".constantize
presenter = klass.new(object, self)
yield presenter if block_given?
presenter
end
end
我之所以这么问是因为我没有太多的经验来处理<代码>结构> <代码>类,当我在上面的方法中坚持<代码>绑定。
- 当我输入
时,我得到,self.class
我想知道在这里得到#
是否表示我有一个class
结构,但我找不到任何文档证实这一点
- 当我输入
时,我得到self.class.class
class
- 当我输入
时,我得到一个扩展对象,它以下面列出的代码行开始self
@ line 16 ApplicationHelper#present: 14: def present(object, klass = nil) 15: klass ||= "#{object.class}Presenter".constantize 16: binding.pry 17: presenter = klass.new(object, self) 18: yield presenter if block_given? 19: end [1] pry(#<#<Class:0x007fb64f696268>>)> self => #<#<Class:0x007fb64f696268>:0x007fb64f6948f0 @_assigns={"marked_for_same_origin_verification"=>true}, @_config={}, @_controller= #<PostsController:0x007fb64f6762d8 @_action_has_layout=true, @_action_name="show", @_config={}, @_db_runtime=0, @_lookup_context= #<ActionView::LookupContext:0x007fb64f6760d0 @cache=true, @details= {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}, @details_key=#<Concurrent::Map:0x007fb64f697938 entries=0 default_proc=nil>, @prefixes=["posts", "application"], @rendered_format=:html, @view_paths= #<ActionView::PathSet:0x007fb64f675fe0
@line 16 ApplicationHelper#出现: 14:def存在(对象,klass=nil) 15:klass | |=“#{object.class}演示者”。恒定化 16:binding.pry 17:presenter=klass.new(对象,自身) 18:如果给出了块,是否让演示者屈服? 19:完 [1] 撬动(#)>self =>#对}, @_config={}, @_控制器=
# 摘要: 使用
说明: 结构是匿名类的构造函数:is_a?(结构)
但是,检查父类和超类:struct_class = Struct.new(:foo) # => #<Class:0x007fa7e006ea98>
您可以在以下任意示例中看到相同的行为:inst.is_a?(Struct) # => true
# inherits from String anon_class = Class.new(String) inst = anon_class.new # => "" inst.class == String # => false inst.is_a?(String) # => true
问题是,当我提交
时,我得到self.is_a?(Struct)
。但是,false
返回self.class.superclass
。。。最后,这让我更接近我想要的东西。谢谢你,麦克斯-pleaner@GinnieHench这表明ActionView::Base
用于动态创建Class.new(ActionView::Base)确实。。。end
的子类,其中包含一些额外的方法以及与所讨论的视图无关的方法。嗯,我还没有在我的应用程序中调用任何类似的方法,但我正在视图中调用erb中的ActionView::Base
方法。通过在pry中运行present
,我看到列出了一堆ActionView::Helpers,以及其他Rails模块,因此我可以看到self.class.祖先
“拥有Bates提到的所有我们想要访问的helper方法”,但我仍然无法100%确定如何称呼self。。。。鉴于self
返回true,而self.is\u a?(Object)
返回true,我不得不接受self.class.is\u a?(class)
是self
中的一个对象。Rails通常会在需要一个单独的容器来存放一堆东西(比如视图)时创建匿名类。你没有这么做,Rails才是。然后Rails会将一组模块(如视图助手)混合到匿名类中,并将实例变量从控制器复制到视图实例中。请记住,这里涉及的是Rails内部,Rails内部并不简单、直接,也没有很好的文档记录。这是非常令人困惑的,需要很长时间才能破解所有的魔法,并让你的头脑围绕它。真的!我不想迷失在野草中,但我也想花一些时间挑战我自己错误的假设,这样我最终可以突破魔法。类
# inherits from String anon_class = Class.new(String) inst = anon_class.new # => "" inst.class == String # => false inst.is_a?(String) # => true