2009-06-02 3 views
0

Я пытаюсь создать свой первый плагин rails, и я хочу, чтобы он был настраиваемым, то есть я хочу иметь возможность устанавливать переменную в файле environment.rb или что-то в этом роде.Как создать настраиваемый плагин Ruby on Rails?

UPDATE: Я пытаюсь сделать что-то вроде того, что сделано здесь: 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
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" 
+0

сладкий, thx! так в чем разница между attr_accessor и mattr_accessor (я новичок в рубине)? – gabe

+0

mattr_accessor только для рельсов и определяет аксессоров на реальном модуле. attr_accessor определяет аксессоров на экземплярах классов (не самих классов). – tomafro

+0

Существует также 'cattr_accessor', который определяет аксессоры на самом классе. –

1

Хотя подход, используемый 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 вместо конфигурации Hash. Это опубликовано просто как пример другого шаблона проектирования.

Смежные вопросы