Как создать настраиваемый плагин Ruby on Rails? - PullRequest
0 голосов
/ 02 июня 2009

Я пытаюсь создать свой первый плагин 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"

Я хочу, чтобы assests_cache_dir по умолчанию был "кэширован", но мог быть установлен в файле конфигурации среды. Я долго гуглял по этому вопросу и не могу найти что-либо, обсуждающее это. Как я могу сделать это?

Ответы [ 2 ]

2 голосов
/ 02 июня 2009
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"
1 голос
/ 03 июня 2009

Хотя подход, используемый tomafro, довольно прост в использовании, другой подход заключается в использовании файла конфигурации в стиле database.yml, который можно разбить в зависимости от среды:

module MyPlugin
  class Configuration
    # == Constants ==========================================================

    CONFIG_FILES = [
      "#{RAILS_ROOT}/config/myplugin.yml",
      "#{RAILS_ROOT}/config/myplugin.yaml"
    ].freeze

    DEFAULT_CONFIGURATION = {
      :url => DEFAULT_HOSTNAME
    }.freeze

    # == Class Methods ======================================================

    # :nodoc:
    def self.config_file_found
      CONFIG_FILES.find do |path|
        File.exist?(path)
      end
    end

    # Returns the default path to the configuration file
    def self.default_path
      config_file_found or CONFIG_FILES.first
    end

    # == Instance Methods ===================================================

    # Creates a new MyPlugin::Configuration instance by reading from the
    # configuration file.
    # +env+ The Rails environment to load
    def initialize(env)
      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 do |options|
          if (options)
            @env_config = @env_config.merge(options.symbolize_keys)
          end
        end
      end
    end

    # Will return +true+ if a configuration file was found and loaded, or
    # +false+ otherwise.
    def exists?
      @env_config != DEFAULT_CONFIGURATION
    end

    # Returns a particular configuration option.
    def [](key)
      @env_config[key.to_sym]
    end
  end

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

Вы бы использовали это как:

settting = MyPlugin.config[:param_name]

Вы также можете написать служебные методы для извлечения определенных значений или использовать OpenStruct вместо хэша конфигурации. Это опубликовано просто как пример другого шаблона проектирования.

...