[英]How/When/Where to Extend Gem Classes (via class_eval and Modules) in Rails 3?
如果我想從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
添加一個app/models/configuration.rb
模型類,它就好像我只是做了class_eval
。
無論如何,這應該是怎么回事? 我找不到任何有關當前Rails 3博客/文檔/要點的內容。
我按如下方式執行此操作,首先將文件添加到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
唯一的缺點是必須重新啟動服務器才能使這些文件的任何更改生效,不確定是否有更好的方法可以解決這個問題。
您可以使用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
這個對我有用。 希望對你有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.