如何将 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

This can teach you more about how Modules in Ruby work

@ 标记开头的变量是 实例变量 。实例变量属于一个实例(对象),这就是为什么它们被称为实例变量(duh!)。

在这种情况下,有两个对象,Controller 和您调用 renderRenderingHelpers 的实例。它们是两个不同的对象,因此,它们每个都有自己不同的实例变量集。