假设我有一个index
动作的控制器,我想将一些数据传递到动作的视图中(index.html.erb
)。
通常,rails方式是:@some_var = some_value
。
从某种意义上说,@some_var
现在可以在任何地方使用(帮助者等等),上述内容是否会增加到全局范围?如果是这样,最好是做locals: {some_var: some_value}
之类的事情吗?
有什么权衡?
答案 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生成。该方法可以 也可以在一个特定的控制器中定义,在这种情况下它只是 影响那里生成的网址。