在Rails 3中如何/何时/何处扩展Gem类(通过class_eval和Modules)?

时间:2010-05-17 08:52:46

标签: ruby-on-rails rubygems initialization module ruby-on-rails-3

如果我想从Rails 3应用程序扩展Gem中埋藏的类,那么通过class_eval和模块(而不是继承)扩展类行为的推荐方法是什么?

一个例子是:

我想添加为标签和类别创建永久链接的功能(通过ActsAsTaggableOn和ActsAsCategory宝石)。

他们定义了TagCategory模型。

我想基本上这样做:

Category.class_eval do
  has_friendly_id :title
end

Tag.class_eval do
  has_friendly_id :title
end

即使有其他方法可以添加可能特定于gem的此功能,在这样的Rails 3应用程序中向类添加行为的推荐方法是什么?

我还创建了一些我想创建的其他宝石,例如Configuration模型和Asset模型。我希望能够在我的应用中添加创建app/models/configuration.rb模型类,并且就像我刚刚class_eval一样。

无论如何,这应该是怎么回事?我找不到任何有关当前Rails 3博客/文档/要点的内容。

2 个答案:

答案 0 :(得分:9)

我按如下方式执行此操作,首先将文件添加到config / initializers,您可以在其中要求包含扩展名的文件:

# config/initializers/extensions.rb
require "#{Rails.root}/app/models/category.rb"
require "#{Rails.root}/app/models/tag.rb"

然后你可以重新打开课程并添加你需要的任何东西:

# app/models/category.rb
class Category
  has_friendly_id :title
end

唯一的缺点是必须重新启动服务器才能使这些文件的任何更改生效,不确定是否有更好的方法可以解决这个问题。

答案 1 :(得分:0)

您可以使用 rails_engine_decorator gem: https://github.com/atd/rails_engine_decorators

只需添加您的Gemfile:

gem 'rails_engine_decorator'

装饰者中的用户class_eval

/app/decorators/models/category_decorator.rb
/app/decorators/models/tag_decorator.rb

它对我有用。我希望你觉得它很有用!