如何/何时/在哪里通过class_eval和模块扩展Rails 3中的Gem类?

11

如果我想要扩展一个嵌套在Gem中的类,并且不使用继承,而是通过class_eval和模块来扩展类行为,那么推荐的方法是什么?例如,我想要为标签和分类创建永久链接(通过ActsAsTaggableOn和ActsAsCategory gem实现),它们定义了TagCategory模型。基本上,我想做的是这个:

Category.class_eval do
  has_friendly_id :title
end

Tag.class_eval do
  has_friendly_id :title
end

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

我还创建了一些其他宝石,例如Configuration模型和Asset模型,我想对它们执行此操作。我想能够添加一个app/models/configuration.rb模型类到我的应用程序中,它会像我刚才执行了class_eval一样运行。

无论如何,这应该如何工作? 我找不到任何当前的Rails 3博客/文档/要点来解决此问题。

2个回答

11

我是这样做的,首先在config/initializers中添加一个文件,其中你可以require包含你的extensions的文件:

# 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

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


我遇到了同样的问题,我得到了LoadError: Expected app/models/tag.rb to define Tag - MhdSyrwan
MhdSyrwan:这意味着在你的'tag.rb'文件中,第一个要定义的类应该被准确地命名为“Tag”,所以看起来你只是没有正确地命名它。 - Jean-Théo

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

这对我很有效,希望你也会觉得有用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接