【问题标题】:Where to put Global variables in Rails 3在 Rails 3 中将全局变量放在哪里
【发布时间】:2010-08-30 08:04:06
【问题描述】:

我曾经在我的 Rails 2.3.8 应用程序中将全局变量放在 environment.rb 中,例如:

MAX_ALLOWD_ITEMS = 6

它似乎在 Rails 3 中不起作用。我尝试将它放在 application.rb 中,但没有帮助。

你有什么建议?

【问题讨论】:

  • 你问的不是变量,而是一个常数,这意味着:它不能从应用程序内部设置。我在这里被搜索引擎误导了,因为这里使用了错误的术语。

标签: ruby-on-rails ruby-on-rails-3 global-variables


【解决方案1】:

如果您已按照 Ryan 的建议尝试重新启动服务器,请尝试将其放入您的 application.rb,如下所示:

module MyAppName
  class Application < Rails::Application
    YOUR_GLOBAL_VAR  = "test"
  end
end

然后你可以在你的控制器、视图或任何地方使用命名空间来调用它..

MyAppName::Application::YOUR_GLOBAL_VAR

另一种选择是使用settingslogic 之类的东西。使用 settingslogic,您只需创建一个 yml 配置文件和一个指向该配置文件的模型 (Settings.rb)。然后,您可以在 Rails 应用程序的任何位置访问这些设置:

Settings.my_setting

【讨论】:

  • 我创建了一个受 settingslogic 启发的插件,但它不需要您为设置创建一个类。您只需包含 yml 文件,并且在服务器启动时动态创建该类。这是回购:github.com/cowboycoded/yettings
  • 它不是变量,而是一个常量,这意味着:它不能从应用程序内部设置。我在这里被搜索引擎误导了,因为这里使用了错误的术语。
【解决方案2】:

我通常使用 application_helper.rb 这是它的样子:

module ApplicationHelper
  def my_global_variable 
    my_global_variable = "Helloworld!"      
  end
end

然后我可以将 my_global_variable 作为函数放在任何地方。

【讨论】:

    【解决方案3】:

    如果你真的像你说的那样在 config/environment.rb 中定义它,我可以复制你的问题的唯一方法是使用 rails server 运行服务器,然后 将变量放入 config/environment.rb,在某个视图或控制器中引用它,然后尝试加载我的应用程序的特定部分。

    如果我停止服务器并再次启动它并尝试访问该视图或控制器,那么它就可以工作。我想你只是没有重新启动你的服务器。

    【讨论】:

      【解决方案4】:

      我通常在 config/initializers/ 中创建一个包含所有全局站点设置的 yaml (yml) 文件。 记得每次更改任何内容时都要重新启动服务器。

      【讨论】:

        【解决方案5】:

        我不知道将变量添加到 environment.rb 的解决方案实际上是否适用于 Rails3 - 具体来说,如果您没有像这样在模块定义中定义变量:

        module MyConfig
          Max_ints = 5
        end
        

        如果您只是将 Max_ints 作为一个简单的定义包含在内,您将无法只使用它。或者至少这是我在试验时发现的情况。我还认为使用 initializers/ 文件夹的建议在易用性方面可能是一个更好的解决方案。见Permanent variable in Rails

        【讨论】: