1

我正在尝试创建我的第一个 rails 插件,并且我希望它是可配置的,也就是说,我希望能够在 environment.rb 文件或其他东西中设置一个变量。

更新:我正在尝试做类似这里所做的事情:http: //soakedandsoaped.com/articles/read/exception-notifier-ruby-on-rails-plugin。我试过模仿他们的代码,但我无法让它工作。

我的插件使用硬编码的值,但到目前为止我为使其可配置所做的一切尝试都没有奏效。

这是一些代码:

#vendor/plugin/markup/lib/markup_helper.rb
module MarkupHelper
    def stylesheet_cache_link_tag(*sources)
      cache = assests_cache_dir ? assests_cache_dir : ""
      options = sources.extract_options!.stringify_keys
      cached_name = options.delete("cached_name")
      stylesheet_link_tag(sources, :cache=> File.join(cache, cached_name))
    end

    def javascript_cache_include_tag(*sources)
      cache = assests_cache_dir ? assests_cache_dir : ""
      options = sources.extract_options!.stringify_keys
      cached_name = options.delete("cached_name")
      javascript_include_tag(sources, :cache=> File.join(cache, cached_name))
    end
end

#something like the following in config/environment.rb or probably config/environments/production.rb
MarkupConfig.assests_cache_dir = "cache"

我希望assets_cache_dir 默认为“缓存”,但能够在环境配置文件中设置。我已经用谷歌搜索了很长时间,但找不到任何讨论这个的东西。我怎样才能做到这一点?

4

2 回答 2

3
module MarkupHelper
  mattr_accessor :assets_cache_dir
  self.assets_cache_dir = "cache"

  def assets_cache_dir
    MarkupHelper.assets_cache_dir
  end
end

然后在 environment.rb (或 development.rb/test.rb/production.rb 如果你想为每个环境不同的值):

MarkupHelper.assets_cache_dir = "my-value"
于 2009-06-02T18:45:54.633 回答
1

虽然 tomafro 使用的方法很容易使用,但另一种方法是使用 database.yml 样式的配置文件,可以根据环境进行拆分:

模块 MyPlugin
  类配置
    # == 常量 ================================================ =============

    配置文件 = [
      "#{RAILS_ROOT}/config/myplugin.yml",
      “#{RAILS_ROOT}/config/myplugin.yaml”
    ]。冻结

    DEFAULT_CONFIGURATION = {
      :url => DEFAULT_HOSTNAME
    }。冻结

    # == 类方法 ============================================== =========

    # :nodoc:
    def self.config_file_found
      CONFIG_FILES.find 做|路径|
        文件存在吗?(路径)
      结尾
    结尾

    # 返回配置文件的默认路径
    def self.default_path
      config_file_found 或 CONFIG_FILES.first
    结尾

    # == 实例方法 ============================================== ======

    # 通过读取创建一个新的 MyPlugin::Configuration 实例
    # 配置文件。
    # +env+ 要加载的 Rails 环境
    定义初始化(环境)
      config_file = self.class.config_file_found

      @env_config = DEFAULT_CONFIGURATION

      if (@config = (config_file and YAML.load(File.open(config_file))))
        [ @config['defaults'], @config[env] ].each 做 |options|
          如果(选项)
            @env_config = @env_config.merge(options.symbolize_keys)
          结尾
        结尾
      结尾
    结尾

    # 如果找到并加载了配置文件,将返回 +true+,或者
    # +false+ 否则。
    def 存在吗?
      @env_config != DEFAULT_CONFIGURATION
    结尾

    # 返回一个特定的配置选项。
    def [](键)
      @env_config[key.to_sym]
    结尾
  结尾

  def self.config
    @config ||= Configuration.new(Rails.env)
  结尾
结尾

您可以将其用作:

设置 = MyPlugin.config[:param_name]

您还可以编写实用程序方法来获取特定值,或使用 OpenStruct 代替配置哈希。这仅作为另一种设计模式的示例发布。

于 2009-06-02T22:08:12.027 回答