Ruby Slim:访问Ruby引擎块中的本地赋值

时间:2014-09-23 17:12:19

标签: ruby-on-rails ruby slim-lang

渲染部分Ruby Slim模板,我在引擎块中嵌入了一个小帮助方法。细分示例:

ruby:
  def new_record_form?
    object.new_record?
  end

此处,object是本地分配的变量,可以在常规Slim代码中使用,但在引擎块的上下文中不可访问。此外,local_assigns也不可用。 如何在这样的块中访问传递给partial的变量?

1 个答案:

答案 0 :(得分:2)

这是Ruby的正常行为,方法无法以这种方式访问​​其范围之外的局部变量 - 事实上,拥有这样的方法是相当不寻常的。

在定义类时可能会看到这样的事情,例如:

class Foo
  object = 7

  # use object in some way in defining the class...

  def bar
    # object not available here
    puts object
  end
end

此处方法bar无法访问object

Ruby也允许使用这样的语法,这与编译Slim代码时的情况更接近:

def foo
  object = 7

  def bar
    puts object
  end

end

但请注意,此不是嵌套方法,调用foo会导致在同一对象上定义bar,但object变量在bar中不可用,调用bar会导致错误。

为了从像这样的内部方法访问变量,它们需要是实例变量。在您的示例中,它看起来像这样:

- @object = ...
ruby:
  def new_record_form?
    @object.new_record?
  end

请注意,一般建议是将模板中的实际代码保持在最低限度。您可能希望将此方法移动到帮助程序中 - 实例变量可以从那里获得。