0

我经常看到表单的代码

RSpec.configure do |config|
  config.include ApiHelper

  # ## Mock Framework
  #
  # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

  # If true, the base class of anonymous controllers will be inferred
  # automatically. This will be the default behavior in future versions of
  # rspec-rails.
  config.infer_base_class_for_anonymous_controllers = false

  config.include FactoryGirl::Syntax::Methods

end

Rails 中是否有一个功能可以让我做类似的事情?我希望能够在 config/initializers/my_class.rb 中使用类似的语法配置我自己的库

MyClass.configure do |config|
  # allow configuration here
end
4

5 回答 5

2

Rails 不需要什么特别的东西——它是简单的 Ruby 代码。这是如何完成的:

class MyClass
  def self.configure(&block)
    a_hash = { :car => "Red" }
    puts "Hello"
    yield a_hash
    puts "There"
  end    
end


MyClass.configure do |config|
  puts "In Block"
  puts config[:car]
end

输出:

Hello
In Block
Red
There

我正在产生一个哈希,但你可以产生任何你想要的对象。

于 2012-07-24T19:06:57.543 回答
2

Rails 将config/initializers在启动服务器时加载目录中的所有 Ruby 文件。

如果您想为您自己的自定义可配置类使用相同的样式,那么您只需实现一个configure接受块并将配置对象传递给该块的类方法。例如

class MyClassConfiguration
  # configuration attributes
end

class MyClass
  def self.configure
    yield configuration if block_given?
  end

  def self.configuration
    @config ||= MyClassConfiguration.new
  end
end

使用 phoet 的 gem 会更容易。

如果你好奇的话,值得看看 RSpec 是如何做到的:

RSpec.configure方法在https://github.com/rspec/rspec-core/blob/master/lib/rspec/core.rb

该类Configurationhttps://github.com/rspec/rspec-core/blob/master/lib/rspec/core/configuration.rb中实现

于 2012-07-24T19:13:50.050 回答
1

我不知道 rails 是否为此提供了帮助,但我为这个问题编写了自己的小解决方案,我在几个 gem 中使用:https ://github.com/phoet/confiture

它让你定义配置:

module Your
  class Configuration
    include Confiture::Configuration

    confiture_allowed_keys(:secret, :key)
    confiture_defaults(secret: 'SECRET_STUFF', key: 'EVEN_MOAR_SECRET')
  end
end

并有一个简单的 api 来进行配置:

Your::Configuration.configure do |config|
  config.secret = 'your-secret'
  config.key    = 'your-key'
end

除此之外,还有很多其他的配置工具,比如 configatron 或 simpleconfig。

于 2012-07-24T19:05:50.710 回答
1

通过块设置的全局配置。

module VkRobioAPI
  module Configuration

  OPTION_NAMES = [
      :client_id,
      :redirect_uri,
      :display,
      :response_type
    ]

    attr_accessor *OPTION_NAMES

    def configure 
      yield self if block_given?
      self
    end

  end
end


module VkRobioAPI
  extend VkRobioAPI::Configuration

  class << self
    def result
     puts VkRobioAPI.client_id 
    end
  end
end

例子:

  VkRobioAPI.configure do |config|
    config.client_id       = '3427211'
    config.redirect_uri   = 'bEWLUZrNLxff1oQpEa6M'
    config.response_type = 'http://localhost:3000/oauth/callback'
    config.display = 'token'
  end

结果:

VkRobioAPI.result
    #3427211
    #=> nil
于 2013-06-04T19:36:53.820 回答
1

如果您使用的是 Rails,您可以将ActiveSupport::Configurable其加入您的课程中,然后离开。在 Rails 之外,您必须将activesuportgem 添加到您的 Gemfile 或 gemspec 中,然后调用require 'active_support/configurable'.

例子

class MyClass
  include ActiveSupport::Configurable
end

用法

带块

MyClass.configure do |config|
  config.key = "something"
  config.key2 = "something else"
end

或内联,无块

MyClass.config.key = "something"
MyClass.config.key2 = "something else"

或像哈希

MyClass.config[:key] = "somehting"
MyClass.config[:key2] = "something else"

注意: key 可以是您选择的任何字符。

于 2018-09-18T17:40:06.673 回答