【问题标题】:application wide global variable应用范围的全局变量
【发布时间】:2011-12-02 12:32:40
【问题描述】:

Rails中,我应该在哪里定义每一层Rails堆栈都可以识别的变量。

例如,我想要一个CUSTOMER_NAME='John' 变量,可以在helperrake任务、controller和模型。我应该在 Rails 应用中哪里定义这个变量?

我正在使用 Rails v2.3.2

【问题讨论】:

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

标签: ruby-on-rails ruby-on-rails-2


【解决方案1】:

/app/config/initializers 的初始化程序中,这里的所有 .rb 文件都会被加载,我通常会为此创建一个名为 preferences.rb 的文件。

见:http://guides.rubyonrails.org/configuring.html#using-initializer-files

【讨论】:

    【解决方案2】:

    另一种方法是在config/application.rb 中的配置对象上设置一个键,如下所示:

    MyApp::Application.configure do
       # ...
       config.my_key = 'some "global" value'
    end
    

    然后,您可以通过以下方式从应用中的任何位置访问my_key

    MyApp::Application.config.my_key
    

    此外,Mike Perham 描述了一种类似但更全面的方法in his blog post

    【讨论】:

    • 这不是常数而不是变量吗?它可以在运行时在应用程序中更改吗?
    • 它是一个变量,可以在运行时更改。
    【解决方案3】:

    您想要一个真正的全局常量吗?使用::COSTUMER_NAME。 你想要一个真正的全局变量吗?使用$COSTUMER_NAME(不鼓励)。 你想要一个请求全局变量吗?在#env 方法中使用Hash

    【讨论】:

    • 你的意思是创建一个linux服务器范围的全局变量?
    • ENV#env 是两个不同的东西。 ENV 是代表 Unix 环境的全局常量。 #env 是一个控制器方法,返回当前机架环境。
    • 我做 ::TESTABC = 'hola' 并尝试从视图打印 ::TESTABC 并且它说未定义
    • 为什么不鼓励 $CUSTOMER_NAME ?
    • $CUSTOMER_NAME 是一个进程全局变量。 ::COSTUMER_NAME 是一个常数,所以当你给它重新赋值时,Ruby 至少会抱怨。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多