UPDA TE: Я добавил сообщение в блоге на основе этого ответа, но с гораздо более подробно: http://thoughtsincomputation.com/posts/coding-an-acts_as-gem-for-rails-3
-
Я не знаю другого источника учебник с верхней части моей головы, но вот некоторые общие советы.
Rails 3 использует действительно полезную функцию Railtie - см. http://api.rubyonrails.org/classes/Rails/Railtie.html.
Итак, если бы я выполнял камень act_as_ *, я бы начал там. Мой railtie может выглядеть примерно так:
# lib/acts_as_awesome/railtie.rb
require 'rails'
require 'acts_as_awesome'
module ActsAsAwesome
class Railtie < Rails::Railtie
config.to_prepare do
ApplicationController.send(:extend, ActsAsAwesome::Hook)
end
end
end
и код ActsAsAwesome :: Крюк:
# lib/acts_as_awesome/hook.rb
module ActsAsAwesome::Hook
def acts_as_awesome(*args)
options = args.extract_options!
# do the things that make the controller awesome.
include ActsAsAwesome::InstanceMethods
before_filter :an_awesome_filter
end
end
Я чувствую понятия здесь звук и использовали аналогичные процессы раньше. В принципе, Rails должен был выполнить блок to_prepare один раз во время производства и перед каждым запросом в разработке (мы хотим, потому что ApplicationController будет перезагружен в это время, потенциально уничтожая наш метод hook); и крюк - это просто: он добавляет привязку ко всем контроллерам (точнее, к всем контроллерам, расширяющим ApplicationController), чтобы позволить пользователю вводить настоящий «Awesome» код в свои контроллеры, не затрагивая при этом других контроллеров, которые ему не нужны.
Крючок #acts_as_awesome сам по себе не передает функцию Awesome. Это потому, что не все контроллеры могут нуждаться в этой функции. Вместо этого метод отвечает за введение в реальность настоящих удивительных вещей через модуль ActsAsAwesome :: InstanceMethods. Таким образом, пользователь получает только функцию Awesome, если они явно вызывают метод act_as_awesome. Он также добавляет перед фильтром перед фильтром, чтобы продемонстрировать, что код в этом методе будет оцениваться точно так же, как если бы он был в самом целевом классе контроллера.
Этот метод должен работать точно так же, если вы настраиваете модели вместо контроллеров: просто вставьте свой крючок в ActiveRecord :: Base. Поскольку AR: B загружается только при загрузке Rails, вероятно, вы, вероятно, сможете вставить его в инициализатор (см. Документы Railtie), но я оставляю за собой право ошибаться здесь.
Информация о ранении: документация читается так, как если бы она была автоматически обнаружена, но у меня часто возникают проблемы с этим.Чтобы обойти это, просто попросите railtie из основного исходного файла вашего драгоценного камня (в приведенном выше примере это будет lib/actions_as_awesome.rb).
Вы можете увидеть весь источник ActsAsAwesome во всей своей красе на моем GitHub счет: http://github.com/sinisterchipmunk/acts_as_awesome
Я надеюсь, что это полезно. Ваш вопрос был несколько высокого уровня, поэтому ответ высокого уровня - это лучшее, что я могу сделать.
-Colin Маккензи IV
http://thoughtsincomputation.com
@sinisterchipmnk
спасибо так много. Я следил за вашими учебниками. это полезно. – cbrulak
Без проблем, рад помочь. Спасибо вам за чтение (и упоминание!) Моего контента :) Я бы никогда не видел этот вопрос, если бы не ссылку. (Saw это всплывает в статистике сайта, хе.) – sinisterchipmunk
Я создал драгоценный камень, основанный на этой статье, и старый плагин Rails. Если вы хотите, вы можете взглянуть на него, так как это хороший пример: https://github.com/toptierlabs/acts_as_fulltextable – Tony