Rails расширяют модели без изменения базового файла - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть два приложения Rails 2.3, мы будем называть их admin и frontend . В admin все мои модели указаны в app/models. В frontend у меня есть эти модели с символическими ссылками. Я хотел бы добавить внешний интерфейс специальные методы в модель, которая отображается только для приложения внешний интерфейс , но не для приложения admin .

Сначала я попытался просто добавить config.autoload_paths += "#{RAILS_ROOT}/app/augments/address.rb" с помощью:

class Address
  def hello
    "hello world"
  end
end

Но это просто не было загружено. Звонки на номер Address.first.hello будут отвечать undefined method 'hello'.

Если мне нужен файл, который делает это:

Address.class_eval do
  def hello
    "hello world"
  end
end

Он загружается один раз, и для первого попадания в разработке он работает, но при всех последующих перезагрузках происходит сбой. Это связано с config.cache_classes = false в разработке.

Полуработающее решение - запустить его из ApplicationController:

class ApplicationController < ActionController::Base
  Address.class_eval do
    def hello
      "hello world"
    end
  end
end

, который перезагружается и работает каждый раз в dev andprod, но не работает для скрипта / бегуна или скрипта / консоли. (Если это единственное решение, я уверен, что мы могли бы извлечь это из модуля и include ModelExtensions в ApplicationController.)

Что я могу добавить в файл environment.rb или инициализатор, который будет перезагружаться каждый раз при разработке?

1 Ответ

0 голосов
/ 15 апреля 2011

Чтобы расширить свой класс, вы должны использовать модуль и включить его в свою модель. Примерно так:

module  Address
  def hello
    "hello world"
  end
end

Это старая, но всегда интересная статья на этот счет: http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

Чтобы включить модуль только во внешний интерфейс, проверьте, существует ли модуль с:

Class A
  include Address if defined? Address
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...