簡體   English   中英

在Rails 3中如何/何時/何處擴展Gem類(通過class_eval和Modules)?

[英]How/When/Where to Extend Gem Classes (via class_eval and Modules) in 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添加一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM