Как/когда / где расширить классы 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
это работает для меня. Надеюсь, вы найдете это полезным!