Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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 - Fatal编程技术网

Ruby on rails 自定义类的初始值设定项中的配置

Ruby on rails 自定义类的初始值设定项中的配置,ruby-on-rails,ruby,Ruby On Rails,Ruby,如何为正在编写的自定义gem设置配置设置 从其他gems中,我看到配置文件的外观如下: # config/intializers/magento_client.rb MagentoClient.configure do |config| config.consumer_key = "1234" config.consumer_secret = "5678" ... end magento_client = MagentoClient.new magento_client.find_

如何为正在编写的自定义gem设置配置设置

从其他gems中,我看到配置文件的外观如下:

# config/intializers/magento_client.rb
MagentoClient.configure do |config|
  config.consumer_key = "1234"
  config.consumer_secret = "5678"
  ...
end
magento_client = MagentoClient.new
magento_client.find_by(isbn: 1234, purchase_type: "Buy New")
我想在
prepare\u access\u token
方法中使用这些配置:

class MagentoClient
  require "oauth"
  require "omniauth"
  require "multi_json"
  require "ostruct"

  def initialize
    @access_token = prepare_access_token
  end

  def find_by(opts) 
    attributes = MultiJson.decode(@access_token.get("/api/rest/products?filter[1][attribute]=isbn&filter[1][eq]=#{opts[:isbn]}&filter[2][attribute]=purchase_type&filter[2][eq]=#{purchase_type_id}").body)
  end

private

  def prepare_access_token
    consumer = OAuth::Consumer.new(@@consumer_key, @@consumer_secret, {:site => @@url})
    token_hash = {oauth_token: @@access_key, oauth_token_secret: @@access_secret}
    access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
  end
end
然后我想使用这样的类:

# config/intializers/magento_client.rb
MagentoClient.configure do |config|
  config.consumer_key = "1234"
  config.consumer_secret = "5678"
  ...
end
magento_client = MagentoClient.new
magento_client.find_by(isbn: 1234, purchase_type: "Buy New")

我可以用与类(magento_client)相同的名称命名初始值设定项文件吗?

一种简单的方法是在可配置类中有一个基本配置对象,它作为类实例变量存在:

class MyClassConfiguration < Struct.new(:consumer_key, :consumer_secret)
end

class MyClass
  class << self
    def config
      @config ||= MyClassConfiguration.new
    end

    def configure(&block)
      yield config
    end
  end
end

MyClass.configure do |c|
  c.consumer_key = '1234'
  # etc ...
end

我将查看关于开发引擎的ruby文档

引擎为分配配置参数提供了一个简单的体系结构。您可以将可配置元素定义为引擎定义的一部分

您还可以查看现有的gem,如Carrierwave,它们具有广泛的配置设置


最终采用了以下解决方案:

# in Gem: lib/magento_rest_api
require "magento_rest_api/version"

module MagentoRestApi
  class << self
    attr_accessor :consumer_key, :consumer_secret, :site, :access_key, :access_secret, :url_params
  end

  def self.configure(&block)
    yield self
  end  

  class Client
    require "oauth"

    def find_by(opts)
      @access_token ||= prepare_access_token       
      [...]   
    end
  private
    def prepare_access_token
      consumer = OAuth::Consumer.new(MagentoRestApi.consumer_key, MagentoRestApi.consumer_secret, :site => MagentoRestApi.site)
      token_hash = {oauth_token: MagentoRestApi.access_key, oauth_token_secret: MagentoRestApi.access_secret}
      access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
    end
    [...]
  end
end

# in Rails: config/initializers/magento_rest_api.rb
MagentoRestApi.configure do |config|
  config.consumer_key = "123a"
  [...]
end
#在Gem:lib/magento\u rest\u api中
需要“magento\u rest\u api/版本”
模块magentopi
类MagentoRestApi.site)
token_hash={oauth_token:MagentoRestApi.access_key,oauth_token_secret:MagentoRestApi.access_secret}
access\u token=OAuth::AccessToken.from\u散列(消费者,令牌散列)
结束
[...]
结束
结束
#在Rails中:config/initializers/magento\u rest\u api.rb
MagentoRestApi.configure do | config|
config.consumer_key=“123a”
[...]
结束