2010-10-25 2 views
7

Я пытаюсь извлечь какой-то общий код в драгоценный камень.rails3 gem: actions_as_something

Я думаю, что acts_as_something - хорошая стратегия для простого повторного использования.

Есть ли хороший учебник, который обсуждает это для драгоценных камней rails3? Я нашел несколько, которые обсуждают rails2 (например, http://guides.rubyonrails.org/plugins.html), но это относится только к rails2

вот некоторые из учебников/блоги Я уже прочитал:

благодаря

ответ

12

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

+0

спасибо так много. Я следил за вашими учебниками. это полезно. – cbrulak

+0

Без проблем, рад помочь. Спасибо вам за чтение (и упоминание!) Моего контента :) Я бы никогда не видел этот вопрос, если бы не ссылку. (Saw это всплывает в статистике сайта, хе.) – sinisterchipmunk

+0

Я создал драгоценный камень, основанный на этой статье, и старый плагин Rails. Если вы хотите, вы можете взглянуть на него, так как это хороший пример: https://github.com/toptierlabs/acts_as_fulltextable – Tony

Смежные вопросы