Ruby on rails 如何创建可配置的RubyonRails插件?

Ruby on rails 如何创建可配置的RubyonRails插件?,ruby-on-rails,ruby,plugins,ruby-on-rails-plugins,Ruby On Rails,Ruby,Plugins,Ruby On Rails Plugins,我正在尝试创建我的第一个rails插件,我希望它是可配置的,也就是说,我希望能够在environment.rb文件或其他文件中设置一个变量 更新:我正在尝试做一些类似于这里所做的事情:。我试着模仿他们的代码,但我无法让它工作 我有一个硬编码的插件,但是到目前为止我为使其可配置所做的一切都没有成功 下面是一些代码: #vendor/plugin/markup/lib/markup_helper.rb module MarkupHelper def stylesheet_cache_link

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

更新:我正在尝试做一些类似于这里所做的事情:。我试着模仿他们的代码,但我无法让它工作

我有一个硬编码的插件,但是到目前为止我为使其可配置所做的一切都没有成功

下面是一些代码:

#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\u cache\u dir默认为“cache”,但能够在环境配置文件中进行设置。我在谷歌上搜索了很长时间,找不到任何关于这个的讨论。我怎样才能做到这一点

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,如果您希望每个环境有不同的值):

然后在environment.rb(或development.rb/test.rb/production.rb,如果您希望每个环境有不同的值):


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

模块MyPlugin 类配置 #==常数========================================================== 配置文件=[ “#{RAILS_ROOT}/config/myplugin.yml”, “#{RAILS_ROOT}/config/myplugin.yaml” ].别动 默认配置={ :url=>默认主机名 }.别动 #==类方法====================================================== #:nodoc: 找到def self.config_文件 CONFIG_FILES.find do| path| 文件是否存在?(路径) 结束 结束 #返回配置文件的默认路径 def self.default_路径 找到配置文件或先配置文件 结束 #==实例方法=================================================== #通过读取 #配置文件。 #+env+要加载的Rails环境 def初始化(环境) 找到config\u file=self.class.config\u文件 @env_config=默认_配置 if(@config=(config_文件和YAML.load(file.open(config_文件))) [@config['defaults'],@config[env]]。每个选项| 如果(选项) @env_config=@env_config.merge(options.symbol_keys) 结束 结束 结束 结束 #如果找到并加载了配置文件,将返回+true+,或者 #+假+否则。 def存在吗? @环境配置!=默认配置 结束 #返回特定的配置选项。 def[](键) @环境配置[键到符号] 结束 结束 def self.config @config | |=Configuration.new(Rails.env) 结束 结束 您可以将其用作:

setting=MyPlugin.config[:param_name]
您还可以编写实用程序方法来获取特定值,或者使用OpenStruct而不是配置哈希。这仅仅是作为另一种设计模式的示例发布的。

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

模块MyPlugin 类配置 #==常数========================================================== 配置文件=[ “#{RAILS_ROOT}/config/myplugin.yml”, “#{RAILS_ROOT}/config/myplugin.yaml” ].别动 默认配置={ :url=>默认主机名 }.别动 #==类方法====================================================== #:nodoc: 找到def self.config_文件 CONFIG_FILES.find do| path| 文件是否存在?(路径) 结束 结束 #返回配置文件的默认路径 def self.default_路径 找到配置文件或先配置文件 结束 #==实例方法=================================================== #通过读取 #配置文件。 #+env+要加载的Rails环境 def初始化(环境) 找到config\u file=self.class.config\u文件 @env_config=默认_配置 if(@config=(config_文件和YAML.load(file.open(config_文件))) [@config['defaults'],@config[env]]。每个选项| 如果(选项) @env_config=@env_config.merge(options.symbol_keys) 结束 结束 结束 结束 #如果找到并加载了配置文件,将返回+true+,或者 #+假+否则。 def存在吗? @环境配置!=默认配置 结束 #返回特定的配置选项。 def[](键) @环境配置[键到符号] 结束 结束 def self.config @config | |=Configuration.new(Rails.env) 结束 结束 您可以将其用作:

setting=MyPlugin.config[:param_name]
您还可以编写实用程序方法来获取特定值,或者使用OpenStruct而不是配置哈希。这仅仅是另一种设计模式的一个例子。

sweet,thx!那么attr_访问器和mattr_访问器(显然我是ruby的新手)之间有什么区别呢?mattr_访问器只是rails,在实际模块上定义访问器。attr_访问器在类的实例(而不是类本身)上定义访问器。还有
cattr_访问器
在类本身上定义访问器。这有点像C#中静态成员和实例成员之间的区别?attr_访问器只能在实例化对象上访问(如C#中的实例成员),而在rails中,mattr_访问器和cattr_访问器可以分别通过使用模块名+点或类名+点来访问(如C#中的静态成员)?我想我过早地将其设置为答案。实际上,我无法使配置文件正常工作。当我尝试启动devweb服务器时,我收到了“uninitialized constant markupulper(namererror)”。这是我所有的东西
MarkupHelper.assets_cache_dir = "my-value"
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]