Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 Rails全局变量-根据来自API的每个请求进行更新_Ruby On Rails_Ruby_Global Variables_Grape - Fatal编程技术网

Ruby on rails Rails全局变量-根据来自API的每个请求进行更新

Ruby on rails Rails全局变量-根据来自API的每个请求进行更新,ruby-on-rails,ruby,global-variables,grape,Ruby On Rails,Ruby,Global Variables,Grape,我使用GrapeGem创建API端点 对于简单用例,让我们考虑一下,当我的Web服务被击中时,我点击另一个第三方REST API,并且获取几个值,并将这些值分配给一个或两个变量。例如variable1,variable2 这些值在第三方API中经常更改,因此我也必须不断更新变量值,在API代码中使用它或将其作为参数在方法之间传递时,一切都很好 但是我有几个控制器,在这些控制器中,应该获取更新的变量/要获取的更新值 目前我所做的是: class Api < Grape::API

我使用GrapeGem创建API端点

对于简单用例,让我们考虑一下,当我的Web服务被击中时,我点击另一个第三方REST API,并且获取几个值,并将这些值分配给一个或两个变量。例如variable1,variable2

这些值在第三方API中经常更改,因此我也必须不断更新变量值,在API代码中使用它或将其作为参数在方法之间传递时,一切都很好

但是我有几个控制器,在这些控制器中,应该获取更新的变量/要获取的更新值

目前我所做的是:

class Api < Grape::API     
 version 'v1'
 format :json
 helpers MyProject::Config

resources :foo do      
  get do
    variable1 = #hit third party URL
    $global_variable1 = variable1
  end
 end
end
哪一种方式更好

我尝试在API类中这样设置@instance变量,但在控制器方法中访问它时,这会给出空字符串

@variable1 = ""
def self.variable1
  @variable1
end
并像ClassName.variable1一样访问它


有谁能提出更好的方法吗?

理想情况下,您可以在启动时创建一个单独的对象来保存这些参数,然后通过某种形式的依赖项注入将该单独的实例注入到每个需要它们的类中,但由于我不知道rails的任何常用依赖项注入方案,我建议这两种选择

有些人不喜欢单件,但你可以把它们存储在单件类中

require 'singleton'

class APIParams
  include Singleton
  attr_accessor :v1, :v2
end

APIParams.instance.v1 = 3

puts APIParams.instance.v1 
这可能有些过分,但您也可以为它们创建一个模型,并将它们存储在数据库中。如果您有多个资源需要存储同一组变量,例如
api_键
和/或令牌,那么这可能很有用

class APIResource < ActiveRecord::Base  
   # you probably would want some `belongs_to`, has_a relationships here to associate these with the models used in your controllers.
end

理想情况下,您可以在启动过程中创建一个单独的对象来保存这些参数,然后通过某种形式的依赖项注入将该单独的实例注入到每个需要它们的类中,但是由于我不知道rails有任何常用的依赖项注入方案,因此我建议使用这两种替代方案

有些人不喜欢单件,但你可以把它们存储在单件类中

require 'singleton'

class APIParams
  include Singleton
  attr_accessor :v1, :v2
end

APIParams.instance.v1 = 3

puts APIParams.instance.v1 
这可能有些过分,但您也可以为它们创建一个模型,并将它们存储在数据库中。如果您有多个资源需要存储同一组变量,例如
api_键
和/或令牌,那么这可能很有用

class APIResource < ActiveRecord::Base  
   # you probably would want some `belongs_to`, has_a relationships here to associate these with the models used in your controllers.
end

全局变量是个坏主意。这和单身汉差不多。 您将如何更新变量以及由谁来更新?什么时候您将如何检查是否过期?如果您有多个ruby进程,它们使用不同的值怎么办

这听起来像是缓存和从缓存读取数据的服务的一个很好的用例

class ParameterService
  def get(parameter_name)
    if parameter is not in cache or expired
      read from external service and store in cache
    end
    return value from cache
  end
end

缓存可以是Redis、DB、Memcached之类的东西。

全局变量是个坏主意。这和单身汉差不多。 您将如何更新变量以及由谁来更新?什么时候您将如何检查是否过期?如果您有多个ruby进程,它们使用不同的值怎么办

这听起来像是缓存和从缓存读取数据的服务的一个很好的用例

class ParameterService
  def get(parameter_name)
    if parameter is not in cache or expired
      read from external service and store in cache
    end
    return value from cache
  end
end

缓存可以是Redis、DB、Memcached之类的东西。

嘿,谢谢你的建议,但我不允许为此在DB中创建任何条目。但我会尝试你提到的单身班方式。非常感谢。为什么不允许您在DB中存储某些内容?嘿,谢谢您的建议,但我不允许为此在DB中创建任何条目。但我会尝试你提到的单身班方式。非常感谢。为什么不允许你在数据库中存储一些东西?你在网站上使用redis吗?您可以使用redis保存这些值,它非常快,您不必弄乱数据库,而且可以从任何人访问它。您在站点上使用redis吗?你可以使用redis保存这些值,速度非常快,你不必弄乱数据库,它可以从任何地方访问。谢谢你的意见,我将存储在redis中,然后使用它。想知道可用的选项。再次感谢,我现在清楚了。嘿,谢谢你的意见,我将存储在redis中,然后使用它。想知道可用的选项。再次感谢,我现在明白了。