Как / Когда / Где Расширить Классы Gem (через class_eval и Модули) в Rails 3? - PullRequest
10 голосов
/ 17 мая 2010

Каков рекомендуемый способ расширения поведения класса с помощью class_eval и модулей (не по наследству), если я хочу расширить класс, похороненный в Gem, из приложения 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. Я хотел бы иметь возможность добавить класс-модель app/models/configuration.rb в свое приложение, и оно будет действовать так, как если бы я только что сделал class_eval.

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

Ответы [ 2 ]

9 голосов
/ 06 июля 2010

Я делаю это следующим образом, сначала добавляю файл в 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

Единственным недостатком является то, что сервер должен быть перезапущен для того, чтобы любые изменения в этих файлах вступили в силу, но не уверен, что есть лучший способ, который бы преодолел это.

0 голосов
/ 01 апреля 2015

Вы можете использовать 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...