如何处理Rails Gem的配置

Mat*_*ham 7 ruby rubygems ruby-on-rails

我正在努力发布我的第一个Gem for Rails.这很简单,但我需要提供一些设置配置选项的权限.我想让用户在'config/initializers'中添加一些内容并与我的gem绑定.

所以,问题是:在Rails gem中提供配置选项是否有最佳实践?

Rya*_*igg 11

在我帮助开发的引擎中,Forem,我们使用mattr_accessors顶级常量,如下所示:

LIB/forem.rb

module Forem
  mattr_accessor :user_class, :theme, :formatter, :default_gravatar, :default_gravatar_image,
                 :user_profile_links, :email_from_address, :autocomplete_field,
                 :avatar_user_method, :per_page
...
Run Code Online (Sandbox Code Playgroud)

然后config/initializers我们要求用户将它们设置为:

Forem.user_class = 'User'
Forem.autocomplete_field = :login
Run Code Online (Sandbox Code Playgroud)

有一个简短的宝石名称,这个解决方案与我建议的另一个解决方案没有太大区别.


解决方案#2

仍然使用mattr_accessors你的顶级常量,但config在这个模块上提供一个方法,它接受一个块并产生对象:

module ReallyComplicatedGemName
  mattr_accessor :....
  def self.config(&block)
    yield(self)
  end
...
Run Code Online (Sandbox Code Playgroud)

这样人们可以这样做:

ReallyComplicatedGemName.config do |config|
  config.user_class = "User"
  ...
end
Run Code Online (Sandbox Code Playgroud)