ERB范围:实例变量与本地变量

时间:2015-03-03 18:59:11

标签: ruby-on-rails ruby performance erb

假设我有一个index动作的控制器,我想将一些数据传递到动作的视图中(index.html.erb)。

通常,rails方式是:@some_var = some_value

从某种意义上说,@some_var现在可以在任何地方使用(帮助者等等),上述内容是否会增加到全局范围?如果是这样,最好是做locals: {some_var: some_value}之类的事情吗?

有什么权衡?

3 个答案:

答案 0 :(得分:1)

是的,@some_var是"全球"从某种意义上说,它添加到视图和帮助程序共享的视图上下文中。因此,您的控制器,视图,部分和帮助程序都可以访问相同的@some_var

使用像这样的实例变量就是Rails惯例:它们只是出现了#34;就像魔术一样#34;在您的视图和帮助程序中没有其他代码。为简单起见,我建议大多数项目,特别是在你开始时。

然而,随着您的Rails应用程序的增长,请记住以下一些其他最佳做法:

  • 尝试将控制器限制为仅分配一个实例变量。如果您发现自己在单个控制器操作中分配了许多实例变量,那通常表明您的控制器试图做太多。
  • 避免在帮助程序中使用实例变量。这使得辅助方法更难在其他上下文中重用,因为它们依赖于设置的实例变量"恰到好处"由控制器。这可能是错误的来源。

答案 1 :(得分:1)

是的,我认为你已经得到了它。我更喜欢像这样的本地论点,即使你是正确的Rails建议你使用实例变量。

我认为当实例变量处于完整模板(从不在部分模板中)时,实例变量可能没问题,特别是当您只有一个与控制器具有相同名称或其他任何变量时。

但总的来说,我同意你的意见。与当地人一起做这件事没有任何不利之处,除非你认为它令人困惑的代码,也许会让那些期望它成为普通人的人感到困惑。 Rails的方式。

我想有人可能认为Rails模板固有地与控制器紧密耦合,就是这样,所以使用实例变量没什么大不了的 - 主要的负面因素是它紧密将您的模板与特定的控制器实现相结合,但他们说,这很好。我想这是一个意见,显然是Rails'意见!当然,很多应用程序都是这样编写的,而且没问题。

但是,除了典型的Rails做事方式以及使用本地模板参数而不是实例变量之外,还有什么东西不会妨碍你。它工作正常。我做到了。

我认为你愿意质疑Rails是对的 - 有时候Rails做出了一些奇怪的选择。并且对于继续做一些不同于Rails似乎想要你做的事情是谨慎的,有时它引起问题。在这种情况下,我不希望它会。

答案 2 :(得分:0)

不,如果您将@some_var = some_value添加到索引操作,那么它将仅应用于该操作。如果要创建全局操作,则可以将其应用于application.rb。

我强烈建议您阅读http://guides.rubyonrails.org/action_controller_overview.html

但具体可能让您感兴趣的是:

  

4.4 default_url_options您可以通过在您的方法中定义名为default_url_options的方法来设置URL生成的全局默认参数   控制器。这样的方法必须返回所需的哈希值   默认值,其键必须是符号:

class ApplicationController < ActionController::Base   def
default_url_options
    { locale: I18n.locale }  
end end
  

这些选项将在生成网址时用作起点,   所以它们可能会被传入的选项所覆盖   url_for电话。

     

如果在ApplicationController中定义default_url_options,就像在   以上示例,它将用于所有URL生成。该方法可以   也可以在一个特定的控制器中定义,在这种情况下它只是   影响那里生成的网址。