如果我想从Rails 3应用程序扩展Gem中埋藏的类,那么通过class_eval
和模块(而不是继承)扩展类行为的推荐方法是什么?
一个例子是:
我想添加为标签和类别创建永久链接的功能(通过ActsAsTaggableOn和ActsAsCategory宝石)。
他们定义了Tag
和Category
模型。
我想基本上这样做:
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博客/文档/要点的内容。
答案 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
它对我有用。我希望你觉得它很有用!