我一直试图理解Ryan Bates在他的演示者RailsCast(#287 Presenters from Scratch (pro) - RailsCasts)中使用的self
方法中的present
类。在视频中,Ryan说,' Self是模板对象,它包含我们想要访问的所有辅助方法,但我想知道这个对象的类。在阅读了一系列博客文章,SO主题和Ruby文档后,我开始认为self
是一种结构,但我不知道如何确认这一概念。< / p>
我的问题是: 1)在下面的present
方法中,self
是Struct?和 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
我之所以这样问是因为我没有太多使用Struct
课程的经验,而且当我在上面的方法中间使用binding.pry
并尝试获取名称时在self
的课程中,我最终会提出更多问题。
self.class
时,我知道,#<Class:0x007fb64f696268>
我想知道在这里获取Class
是否表明我有Struct
,但我无法&#39 ;找到任何证实此内容的文件 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
此post有助于解释结构如何工作,但无法解释如何确认他们是否具有结构。
最初,当我开始剖析present
方法时,我发现此answer会有所帮助。然而,我被评论抛弃了,说通过传递模型和ApplicationHelper类&#34;来初始化&#34; ModelPresenter,因为ApplicationHelper是一个模块。
答案 0 :(得分:1)
<强>摘要强>:
使用is_a?(Struct)
<强>解释强>:
struct是匿名类的构造函数:
struct_class = Struct.new(:foo)
# => #<Class:0x007fa7e006ea98>
您可以检查匿名类的实例是否是这样的结构:
inst = struct_class.new
inst.class.superclass
# => Struct
但是Object#is_a?会检查父类以及超类:
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