How/When/Where для Расширения Классов Драгоценного камня (через class_eval и Модули) в направляющих 3?

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

Пример - это:

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

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

Я хочу в основном сделать это:

Category.class_eval do
  has_friendly_id :title
end

Tag.class_eval do
  has_friendly_id :title
end

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

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

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

10
задан Jon Seigel 23 May 2010 в 00:52
поделиться

1 ответ

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

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

9
ответ дан 4 December 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: