如何将 var 传递给包含的模块?
How to pass a var to an included module?
可能很简单,但我对使用 ruby include
:
有点困惑
app.rb:
class Controller
@template_ext = '.slim'
def template_ext
'.slim'
end
include RenderingHelpers
end
rendering_helpers.rb:
module RenderingHelpers
def render(resp_code=200)
puts @template_ext # Breaks
puts template_ext() # => '.slim'
# Not important:
path = File.expand_path(find_template())
tilt = Tilt.new(find_template()).render(self)
Rack::Response.new tilt, resp_code
end
结束
我有点困惑为什么方法 template_ext()
有效而 @template_ext
无效?
对于变量,你可以把你的变量设为class变量-
class Controller
@@template_ext = '.slim'
def template_ext
'.slim'
end
include RenderingHelpers
end
或者你可以做 -
module RenderingHelpers
extend ActiveSupport::Concern
included do
@template_ext = '.slim'
end
def render(resp_code=200)
puts @template_ext # Breaks
puts template_ext() # => '.slim'
# Not important:
path = File.expand_path(find_template())
tilt = Tilt.new(find_template()).render(self)
Rack::Response.new tilt, resp_code
end
end
在您的示例中,@template_ext
变量实际上是一个 class 级别的实例变量,这使得 render
.
等实例方法无法访问它
您真正想要做的只是删除 @template_ext
分配并坚持使用您的方法 template_ext
。
以 @
标记开头的变量是 实例变量 。实例变量属于一个实例(对象),这就是为什么它们被称为实例变量(duh!)。
在这种情况下,有两个对象,Controller
和您调用 render
的 RenderingHelpers
的实例。它们是两个不同的对象,因此,它们每个都有自己不同的实例变量集。
可能很简单,但我对使用 ruby include
:
app.rb:
class Controller
@template_ext = '.slim'
def template_ext
'.slim'
end
include RenderingHelpers
end
rendering_helpers.rb:
module RenderingHelpers
def render(resp_code=200)
puts @template_ext # Breaks
puts template_ext() # => '.slim'
# Not important:
path = File.expand_path(find_template())
tilt = Tilt.new(find_template()).render(self)
Rack::Response.new tilt, resp_code
end
结束
我有点困惑为什么方法 template_ext()
有效而 @template_ext
无效?
对于变量,你可以把你的变量设为class变量-
class Controller
@@template_ext = '.slim'
def template_ext
'.slim'
end
include RenderingHelpers
end
或者你可以做 -
module RenderingHelpers
extend ActiveSupport::Concern
included do
@template_ext = '.slim'
end
def render(resp_code=200)
puts @template_ext # Breaks
puts template_ext() # => '.slim'
# Not important:
path = File.expand_path(find_template())
tilt = Tilt.new(find_template()).render(self)
Rack::Response.new tilt, resp_code
end
end
在您的示例中,@template_ext
变量实际上是一个 class 级别的实例变量,这使得 render
.
您真正想要做的只是删除 @template_ext
分配并坚持使用您的方法 template_ext
。
以 @
标记开头的变量是 实例变量 。实例变量属于一个实例(对象),这就是为什么它们被称为实例变量(duh!)。
在这种情况下,有两个对象,Controller
和您调用 render
的 RenderingHelpers
的实例。它们是两个不同的对象,因此,它们每个都有自己不同的实例变量集。