Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 钢轨中的永久变量_Ruby On Rails_Ruby On Rails 3_Ruby On Rails 3.1_Rubygems - Fatal编程技术网

Ruby on rails 钢轨中的永久变量

Ruby on rails 钢轨中的永久变量,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.1,rubygems,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.1,Rubygems,比如说,在我的Rails应用程序的顶部有一个显示文本的栏——最新的热门交易、计划停机通知等等。它是一个单一的、基于某种类型的信息,基本上每个请求都需要访问它,并且可以随时更新。实现这一目标的最佳方式是什么 我想做的是某种永久的全局变量(可从控制器访问) 它很少被更新,所以如果在更新后的一段时间内,工作人员之间会出现不一致的情况,这是没有问题的 另一方面,它应该是持久的,以防服务器出现故障(定期备份就足够了) 它会经常被访问,所以应该尽可能快——最好是留在内存中 而且,它只是其中之一,所以我真的

比如说,在我的Rails应用程序的顶部有一个显示文本的栏——最新的热门交易、计划停机通知等等。它是一个单一的、基于某种类型的信息,基本上每个请求都需要访问它,并且可以随时更新。实现这一目标的最佳方式是什么

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

  • 它很少被更新,所以如果在更新后的一段时间内,工作人员之间会出现不一致的情况,这是没有问题的
  • 另一方面,它应该是持久的,以防服务器出现故障(定期备份就足够了)
  • 它会经常被访问,所以应该尽可能快——最好是留在内存中
  • 而且,它只是其中之一,所以我真的不想用专用数据库模型来膨胀应用程序
例如,在Node.js中这样做非常简单,但我在Rails中找不到一种方法来实现这一点。我该怎么办

编辑

感谢迄今为止的答案,但尽管它们令人鼓舞,但我认为我应该强调它们都缺少的一个关键功能变量应在应用程序内部可编辑并保持不变。虽然可以编辑变量,但在服务器重新启动的情况下,我会返回默认值-这是错误的。

来源:

尝试将其放入applicaton.rb,如下所示:

module MyAppName
  class Application < Rails::Application
    YOUR_GLOBAL_VAR  = "test"
  end
end
另一种替代方法是使用类似的方法。使用settingslogic,您只需创建一个yml配置文件和一个指向该配置文件的模型(Settings.rb)。然后,您可以使用以下工具访问rails应用程序中的任何位置的这些设置:

Settings.my_setting

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

config/initializers/foo.rb

 MYVARIABLE = 'some string'

可以从应用程序中的任何位置作为
MYVARIABLE

访问,这取决于您要查找的内容。只需将它放入
应用程序\u controller.rb

class ApplicationController < ActionController::Base
   def system_message
     "Come buy our amazing .99 iphone chocolate bar apps, with 100% more gamification!"
   end
end
MYANNOUNCEMENT = "NOW LISTEN TO ME!"
您还可以在
初始值设定项
目录下创建自己的文件,该目录预先加载在rails中

所以
siteAnnounce.rb

class ApplicationController < ActionController::Base
   def system_message
     "Come buy our amazing .99 iphone chocolate bar apps, with 100% more gamification!"
   end
end
MYANNOUNCEMENT = "NOW LISTEN TO ME!"

您可能还想查看这个

我已经开始在配置对象中放置类似的常量和变量,例如

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

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

我觉得在适当的时候,全局变量对于需要在许多地方共享该公共值的代码来说是很好的,但这是代码,而不是用户视图。

在这种情况下,这显然是正确的,因为OP已加粗“可由应用程序编辑”。因此,我将有一个视图,允许用户输入它,它存储在db表中,然后根据需要调用(缓存一次使用)。

好的,下面是我所做的。我不只是将值放入初始值设定项,而是在其中创建了一个简单的类来处理它。变量本身存储在预定义文件中。除了在初始化时读取文件外,该类还会在值更改时更新文件,并定期重新读取文件以保持工作进程之间的一致性。我还提供了一些基本的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
class石榴
def初始化
@延迟=30.5分钟
@path=“db/石榴.json”
@valid=Time.now-1
验证
结束
def get(*p)
验证
p、 注入(@data){| object,key | object[key]if object}
结束
def设置(*p、q、v)
hash=p.inject(@data){| object,key | object[key]| |={}
散列[q]=v
结束
def保存
@valid=Time.now+@delay
File.open(@path,“w”){| f | f.write(@data.to_json)}
结束
私有的
def验证
如果@valid
我也遇到过类似的问题。 我的问题是,我需要在所有级别中使用全局变量(MVC)。 我们使用Memcache来存储变量。 也许你也可以采用类似的解决方案。
作为额外的奖励,您可以在整个程序中更改它。

我倾向于使用初始值设定项。一个问题是:如果我以后更改变量,它在工作人员之间是否保持一致?因为变量将硬编码到站点中,并且您需要关闭服务器来部署代码,一旦您将其全部备份,它应该保持一致。我看到您遇到的唯一问题是,如果您尝试使用某种连续部署系统更改变量,但这不是我的专业领域。如果我以后更改变量,工作人员之间是否一致?不,您可以使用dRuby在所有工作人员之间传递更新。