Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中,如何验证结构的标识?_Ruby On Rails_Ruby_Struct_Self_Presenter - Fatal编程技术网

Ruby on rails 在Ruby中,如何验证结构的标识?

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

我一直在试图理解Ryan Bates在他的演讲者RailsCast()中使用的
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
    返回
    ActionView::Base
    。。。最后,这让我更接近我想要的东西。谢谢你,麦克斯-pleaner@GinnieHench这表明
    Class.new(ActionView::Base)确实。。。end
    用于动态创建
    ActionView::Base
    的子类,其中包含一些额外的方法以及与所讨论的视图无关的方法。嗯,我还没有在我的应用程序中调用任何类似的方法,但我正在视图中调用erb中的
    present
    方法。通过在pry中运行
    self.class.祖先
    ,我看到列出了一堆ActionView::Helpers,以及其他Rails模块,因此我可以看到
    self
    “拥有Bates提到的所有我们想要访问的helper方法”,但我仍然无法100%确定如何称呼self。。。。鉴于
    self.is\u a?(Object)
    返回true,而
    self.class.is\u a?(class)
    返回true,我不得不接受
    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