Rails中的永久变量

时间:2012-02-28 22:44:19

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 rubygems

让我们说在我的Rails应用程序之上有一个显示文本的栏 - 最新特价,预定的停机时间通知,类似的东西。它是一种基于每种请求都需要访问的单一信息,并且可能会不时更新。实现这一目标的最佳方法是什么?

我想做的是某种永久性全局变量(可从控制器访问)。

  • 它很少会更新,所以如果在更新后的一段时间内工作人员之间会有不一致的话,就没有问题。
  • 另一方面,如果服务器出现故障(定期备份就足够了),它应该是持久的。
  • 它会经常被访问,所以它应该尽可能快 - 最好留在记忆中。
  • 此外,它只是独一无二的,所以我真的不想用专用的数据库模型来膨胀应用程序。

例如,在Node.js中这样的东西很容易,但我找不到在Rails中实现这一点的单一方法。我该怎么办?

修改

感谢到目前为止的答案,但是虽然他们鼓舞人心,但我认为我应该强调一个他们都缺少的关键功能。 该变量应该可以在应用程序内部进行编辑并且持久化。虽然可以编辑变量,但在服务器重启的情况下,我又回到默认状态 - 这很糟糕。

7 个答案:

答案 0 :(得分:2)

这取决于你在寻找什么。您可以通过将其放在application_controller.rb

中来做一些非常简单的事情
class ApplicationController < ActionController::Base
   def system_message
     "Come buy our amazing .99 iphone chocolate bar apps, with 100% more gamification!"
   end
end

然后可以从应用程序中的任何控制器访问该函数(和字符串)。您还可以在application.rb文件的after_initialize块中指定一些内容。

config.after_initialize do
  ::MYTEXT  = "MY SUPER AMAZING TEXT"
end

您还可以在initializers目录下创建自己的文件,该目录已预先加载到rails中。

所以siteAnnounce.rb

MYANNOUNCEMENT = "NOW LISTEN TO ME!"

您可能还想查看此Railscast video about site wide announcements

答案 1 :(得分:2)

我会将它存储在数据库中,让缓存处理它。

我认为全局变量在适当的情况下适用于需要在许多地方共享该公共值的代码,但这是代码,而不是用户视图。
在这种情况下,这显然是正确的,因为OP已加粗'应用程序可编辑'。所以我会有一个允许用户输入它的视图,它存储在db表中,然后根据需要调用(如曾经使用一次缓存)。

答案 2 :(得分:2)

我遇到过类似的问题。 我的问题是我需要一个所有级别的全局变量(MVC)。 我们使用 Memcache 来存储变量。 也许你可以去寻找类似的解决方案。 作为额外的奖励,你可以在整个计划中改变它。

答案 3 :(得分:1)

您可以在初始值设定项中将其声明为常量:

config/initialzers/foo.rb

 MYVARIABLE = 'some string'

可以从应用程序的任何位置访问MYVARIABLE

答案 4 :(得分:1)

好的,这就是我的所作所为。我没有将值放到初始化器中,而是设置了一个处理它的简单类。变量本身存储在预定义的文件中。除了在初始化时读取文件,类在更改值时更新文件,并且还定期重新读取文件以保持工作者之间的一致性。我还提供了一些基本的JSON处理和备份功能,以使生活更轻松。

对于任何有兴趣的人,这是重要的代码:

class Pomegranate

  def initialize
    @delay = 30.minutes
    @path = "db/pomegranate.json"
    @valid = Time.now - 1
    validate
  end

  def get(*p)
    validate
    p.inject(@data) {|object,key| object[key] if object}
  end

  def set(*p, q, v)
    hash = p.inject(@data) {|object,key| object[key]||={}}
    hash[q] = v
  end

  def save
    @valid = Time.now + @delay
    File.open(@path,"w") {|f| f.write(@data.to_json)}
  end

  private

  def validate
    if @valid < Time.now
      @data = ActiveSupport::JSON.decode(File.read(@path)) rescue {}
      @valid = Time.now + @delay
      @valid = Time.now - 1 if @data.empty?
    end
  end

end

$pom = Pomegranate.new

答案 5 :(得分:0)

来源: Where to put Global variables in Rails 3

尝试将它放入您的applicaton.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

答案 6 :(得分:0)

我已经开始在配置对象中添加这样的常量和变量,例如

TestApp::Application.config.foo = 'bar'
TestApp::Application.config.something = { :a => 1, :b => 2 }