Как/когда / где расширить классы Gem (через класс eval и модули) в Rails 3?

каков рекомендуемый способ расширения поведения класса через class_eval и модули (не по наследству), если я хочу расширить класс, похороненный в драгоценном камне из приложения Rails 3?

пример такой:

Я хочу добавить возможность создания постоянных ссылок для тегов и категорий (через драгоценные камни ActsAsTaggableOn и ActsAsCategory).

они определили Tag и Category - модели.

Я хочу в принципе сделать это:

Category.class_eval do
  has_friendly_id :title
end

Tag.class_eval do
  has_friendly_id :title
end

даже если есть другие способы добавления этой функции, которые могут быть специфичными для драгоценного камня,каков рекомендуемый способ добавления поведения в классы в приложении Rails 3?

у меня есть несколько других драгоценных камней, которые я создал, чтобы сделать это, например Configuration и Asset модель. Я хотел бы иметь возможность добавить create an app/models/configuration.rb класс модели для моего приложения, и он будет действовать так, как если бы я просто сделал class_eval.

в любом случае, как это должно сработать? Я не могу найти ничего, что охватывает это из любого из текущих блогов Rails 3 / docs / gists.

2 ответов


Я делаю это следующим образом, Сначала добавьте файл в 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 камень: https://github.com/atd/rails_engine_decorators

просто добавьте в свой Gemfile:

gem 'rails_engine_decorator'

и в декораторы:

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

это работает для меня. Надеюсь, вы найдете это полезным!