Статьи

Howto: написать плагин

В моем предыдущем посте я перечислил 6 вещей, которые вы должны попробовать в Rails. Я также пообещал несколько примеров кода, чтобы вы начали. Так как я уже рассмотрел установку и модернизацию рельсов, в следующей кабине написано плагин.

Плагины — это просто фантастика — они позволяют вам абстрагировать общий код в красивые небольшие пакеты, которые вы можете использовать в других проектах. В Rails даже есть встроенная система для загрузки плагинов других людей прямо из их хранилища SVN. С переходом на Rails 2.0 некоторые функциональные возможности, используемые для ядра, были перенесены в плагины, чтобы очистить ядро ​​дерева и позволить другим разработчикам выпускать новые версии плагинов за пределами обычных Rails. циклы выпуска.

В этом (очень кратком) уроке мы создадим плагин acts_as_blabbermouth, который будет печатать случайные кавычки. Очевидно, что этот плагин мало полезен в реальном мире, но он должен служить хорошей демонстрацией того, как работают плагины.

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

script/generate plugin acts_as_blabbermouth 

Вы должны увидеть вывод, похожий на этот:

create vendor/plugins/acts_as_blabbermouth/lib create vendor/plugins/acts_as_blabbermouth/tasks create vendor/plugins/acts_as_blabbermouth/test create vendor/plugins/acts_as_blabbermouth/README create vendor/plugins/acts_as_blabbermouth/MIT-LICENSE create vendor/plugins/acts_as_blabbermouth/Rakefile create vendor/plugins/acts_as_blabbermouth/init.rb create vendor/plugins/acts_as_blabbermouth/install.rb create vendor/plugins/acts_as_blabbermouth/uninstall.rb create vendor/plugins/acts_as_blabbermouth/lib/acts_as_blabbermouth.rb create vendor/plugins/acts_as_blabbermouth/tasks/acts_as_blabbermouth_tasks.rake create vendor/plugins/acts_as_blabbermouth/test/acts_as_blabbermouth_test.rb 

Как вы можете видеть, весь стандартный код был создан в каталоге vendor / plugins / acts_as_blabbermouth.

README и MIT-LICENSE — это просто общие текстовые файлы, которые вы должны заполнить — как правило, файл README — это первое место, где новый пользователь будет искать инструкции для плагина.

Каталог lib будет содержать в себе содержимое вашего плагина. Каталог задач — это место, где вы можете хранить любые грабли, которые могут понадобиться вашему плагину. Каталог tests, конечно, довольно понятен — точно так же, как вы можете протестировать свое Rails-приложение, вы также можете протестировать свой плагин. Файлы install.rb и uninstall.rb вызываются при установке и удалении вашего плагина — вы можете разместить здесь код, чтобы инициализировать вашу среду и выполнить очистку после себя. Наконец, init.rb — это файл, который Rails фактически вызывает для загрузки вашего плагина.

Основной файл, о котором нам нужно беспокоиться, это /lib/acts_as_blabbermouth.rb — именно туда пойдет наш основной код.

Во-первых, нам нужно включить файл act_as_blabbermouth.rb в среду. Это делается путем добавления следующей строки в файл init.rb:

require File.dirname(__FILE__) + '/lib/acts_as_blabbermouth'
require File.dirname(__FILE__) + '/lib/acts_as_blabbermouth' 

Затем мы добавляем следующий код в lib / acts_as_blabbermouth.rb

# ActsAsBlabbermouth module ActiveRecord #:nodoc: module Acts #:nodoc: module Blabbermouth #:nodoc: def self.included(base) base.extend(ClassMethods) end module ClassMethods def acts_as_blabbermouth include ActiveRecord::Acts::Blabbermouth::InstanceMethods extend ActiveRecord::Acts::Blabbermouth::SingletonMethods end end module SingletonMethods def quote_me quotes = [ "When you come to a fork in the road, take it. -Yogi Berra", "Every child is an artist. The problem is how to remain an artist once he grows up. -Pablo Picasso", "What we anticipate seldom occurs; what we least expected generally happens. -Benjamin Disraeli", "Drive-in banks were established so most of the cars today could see their real owners. -E. Joseph Cossman", "The greatest pleasure in life is doing what people say you cannot do. -Walter Bagehot" ] quotes[rand(quotes.size)] end end module InstanceMethods def quote_me self.class.quote_me end end end end end ActiveRecord::Base.send(:include, ActiveRecord::Acts::Blabbermouth) методы # ActsAsBlabbermouth module ActiveRecord #:nodoc: module Acts #:nodoc: module Blabbermouth #:nodoc: def self.included(base) base.extend(ClassMethods) end module ClassMethods def acts_as_blabbermouth include ActiveRecord::Acts::Blabbermouth::InstanceMethods extend ActiveRecord::Acts::Blabbermouth::SingletonMethods end end module SingletonMethods def quote_me quotes = [ "When you come to a fork in the road, take it. -Yogi Berra", "Every child is an artist. The problem is how to remain an artist once he grows up. -Pablo Picasso", "What we anticipate seldom occurs; what we least expected generally happens. -Benjamin Disraeli", "Drive-in banks were established so most of the cars today could see their real owners. -E. Joseph Cossman", "The greatest pleasure in life is doing what people say you cannot do. -Walter Bagehot" ] quotes[rand(quotes.size)] end end module InstanceMethods def quote_me self.class.quote_me end end end end end ActiveRecord::Base.send(:include, ActiveRecord::Acts::Blabbermouth)
# ActsAsBlabbermouth module ActiveRecord #:nodoc: module Acts #:nodoc: module Blabbermouth #:nodoc: def self.included(base) base.extend(ClassMethods) end module ClassMethods def acts_as_blabbermouth include ActiveRecord::Acts::Blabbermouth::InstanceMethods extend ActiveRecord::Acts::Blabbermouth::SingletonMethods end end module SingletonMethods def quote_me quotes = [ "When you come to a fork in the road, take it. -Yogi Berra", "Every child is an artist. The problem is how to remain an artist once he grows up. -Pablo Picasso", "What we anticipate seldom occurs; what we least expected generally happens. -Benjamin Disraeli", "Drive-in banks were established so most of the cars today could see their real owners. -E. Joseph Cossman", "The greatest pleasure in life is doing what people say you cannot do. -Walter Bagehot" ] quotes[rand(quotes.size)] end end module InstanceMethods def quote_me self.class.quote_me end end end end end ActiveRecord::Base.send(:include, ActiveRecord::Acts::Blabbermouth) 

Теперь создайте файл модели с именем quote.rb, запустив

 скрипт / сгенерировать модель цитаты


и добавьте следующую строку после объявления класса и перед объявлением конца

acts_as_blabbermouth
acts_as_blabbermouth 

Запустите скрипт / консоль и введите:

 Quote.quote_me

Вуаля! Если все пошло по плану, вы должны увидеть одну из случайных цитат. Поздравляем! Вы только что написали плагин!

Так как мы это сделали?

  1. Мы углубились в модуль ActiveRecord :: Acts и смешались в модуле под названием Blabbermouth. Это действует как пространство имен в других языках, так что мы можем создавать наш собственный набор классов и методов, не надавливая на плагины других людей.
  2. Мы переопределяем включенный метод класса, который вызывается, когда плагин смешивается с другим модулем. Здесь мы включаем модуль ClassMethods, который предоставляет метод act_as_blabbermouth классу модели
  3. Мы определяем метод act_as_blabbermouth. Все, что делает этот метод, включает модули InstanceMethods и SingletonMethods. Модуль InstanceMethods содержит все методы, доступные для экземпляра объекта, а SingletonMethods содержит все методы, доступные для неинстанцированного класса.
  4. Мы создаем SingletonMethod с именем quote_me, который возвращает случайную цитату. Это можно вызвать, вызвав Quote.quote_me. Мы также создаем метод с именем quote_me в модуле InstanceMethods, который вызывает SingletonMethod — так и класс, и объект могут вызывать метод quote_me.
  5. Наконец, мы вызываем ActiveRecord :: Base.send (: include, ActiveRecord :: Acts :: Blabbermouth), который сообщает модулю ActiveRecord :: Base включить код, который мы написали.

Для тех из вас, кто играет дома, я добавил подключаемый модуль в tar-архив , чтобы вы могли лучше понять, как все это сочетается. Так что давай, иди и создай плагин самостоятельно!