Rails中的永久变量

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

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

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

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

编辑

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

这真的取决于你在寻找什么。 您可以通过将其放在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!" 

您可能还想查看有关网站范围公告的Railscastvideo

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

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

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

您可以在初始化程序中将其声明为常量:

config/initialzers/foo.rb

  MYVARIABLE = 'some string' 

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

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

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

 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 

来源: 将全局变量放在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 

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

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