Руководство для начала собственный двигатель Rails Gem

С Rails 3 была выпущена, разработчики писали Rails двигателей в новых чистых стилей, которые могут быть упакованы в RubyGems.Rails двигатель расфасованный приложение, которое может быть запущен или установлен в другом приложении Rails.Двигатель может иметь свои собственные модели, представления, контроллеры, генераторов и публично подают статические files.



(Изображение: maicos)

Теперь, если вам не нравится писать много кода, это хорошая новость, потому что это означает, что вы можете написать двигатель раз и использовать его снова и снова.Допустим, вы строите много веб-сайтов для малого бизнеса.Общее требование для таких веб-сайтов страницу со списком всех сотрудников компании, а также основные сведения о них.Это отличный кандидат на Rails жемчужина двигателя по причине того, изменится очень мало, и можно абстрагировать, общий набор requirements.

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

Enginex

Jose Valim, основной вклад Rails, создала инструмент под названием Enginex, что строительные леса Rails 3-совместимый драгоценных камней двигателя.Эта программа защищает вас от многих подводных камней, что разработчики двигателя жемчужина лицу.Он обеспечивает основные настройки, в том числе тестового приложения Rails, который вы должны будете получить started.

Для начала выполните следующие из командной строки в стандартный каталог проектов:

gem install enginex
enginex team_page

При этом, вы будете в конечном итоге с проектом в team_page каталог, содержащий стандартный Enginex scaffolding.

Set-Up

Чтобы настроить нашу жемчужину, мы будем модифицировать несколько файлов.Во-первых, наши team_page.gemspec и наши Gemfile нужно немного love.

# CURRENT FILE :: team_page.gemspec
require File.expand_path("../lib/team_page/version", __FILE__)

# Provide a simple gemspec so that you can easily use your
# Enginex project in your Rails apps through Git.
Gem::Specification.new do |s|F
  s.name                      = "team_page"
  s.version                   = TeamPage::VERSION
  s.platform                  = Gem::Platform::RUBY
  s.authors                   = [ "Your Name" ]
  s.email                     = [ "your@email.com" ]
  s.homepage                  = "http://yourwebsite.com"
  s.description               = "A simple Rails 3 engine gem that adds a team page to any Rails 3 application."
  s.summary                   = "team_page-#{s.version}"

  s.rubyforge_project         = "team_page"
  s.required_rubygems_version = "> 1.3.6"

  s.add_dependency "activesupport" , "~> 3.0.7"
  s.add_dependency "rails"         , "~> 3.0.7"

  s.files = `git ls-files`.split("\n")
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
  s.require_path = 'lib'
end
# CURRENT FILE :: Gemfile
source "http://rubygems.org"
# Specify any dependencies in the gemspec
gemspec

Это настраивает наш gemspec, чтобы автоматически использовать файлы, которые мы совершили с Git, и любые исполняемые файлы можно добавить в будущем, и использовать VERSION константа, мы укажем в нашем gem.

Кроме того, по телефону gemspec в наших Gemfile, работает bundle install будет загружать зависимости от наших team_page.gemspec, что convention.

След, чтобы наш драгоценный камень в двигателе Rails, давайте добавлять или изменять трех файлов.Во-первых, наши верхнего уровня команды страницу файла:

# CURRENT FILE :: lib/team_page.rb
# Requires
require "active_support/dependencies"

module TeamPage

  # Our host application root path
  # We set this when the engine is initialized
  mattr_accessor :app_root

  # Yield self on setup for nice config blocks
  def self.setup
    yield self
  end

end

# Require our engine
require "team_page/engine"

Для mattr функций, наш ActiveSupport зависимостей требуется.Мы также создали хороший способ настроить наш драгоценный камень с self.setup метод.Двигатель должен в конце нашего файла, так что мы можем быть уверены, что любая зависимость указанных first.

Во-вторых, наш вариант файла:

# CURRENT FILE :: lib/team_page/version.rb
module TeamPage
  VERSION = "0.0.1"
end

Наконец, наш двигатель файла:

# CURRENT FILE :: lib/team_page/engine.rb
module TeamPage

  class Engine < Rails::Engine

    initialize "team_page.load_app_instance_data" do |app|
      TeamPage.setup do |config|
        config.app_root = app.root
      end
    end

    initialize "team_page.load_static_assets" do |app|
      app.middleware.use ::ActionDispatch::Static, "#{root}/public"
    end

  end

end

Это определяет два Railsinitialize блоки, которые нам ключ в корневом каталоге с приложением хост Rails, а также выполнять любые файлы в корневой public каталог нашей gem.

Data Model

Для добавления модели в нашу жемчужину, мы в первую очередь необходимо указать миграции и генератор класса, чтобы скопировать его на хост-приложения Rails.Хотя этот процесс станет более прозрачным в Rails 3.1, теперь нам нужно построить несколько генераторов классов.Большой ресурс для этого можно найти по меньшей Непал Rails.

Во-первых, давайте добавим наши генераторы класса:

# CURRENT FILE :: lib/generators/team_page/team_page_generator.rb
# Requires
require 'rails/generators'
require 'rails/generators/migration'

class TeamPageGenerator < Rails::Generators::Base
  include Rails::Generators::Migration
  def self.source_root
    @source_root ||= File.join(File.dirname(__FILE__), 'templates')
  end

  def self.next_migration_number(dirname)
    if ActiveRecord::Base.timestamped_migrations
      Time.new.utc.strftime("%Y%m%d%H%M%S")
    else
      "%.3d" % (current_migration_number(dirname) + 1)
    end
  end

  def create_migration_file
    migration_template 'migration.rb', 'db/migrate/create_team_members_table.rb'
  end
end

Добавление что это позволит разработчикам запускать rails g team_page из своих приложений Rails и создать необходимый файл миграции к власти нашей команды page.

Следующее, мы собрали образцы миграции:

# CURRENT FILE :: lib/generators/team_page/templates/migration.rb
class CreateTeamMembers < ActiveRecord::Migration
  def self.up
    create_table :team_members do |t|
      t.string :name
      t.string :twitter_url
      t.string :bio
      t.string :image_url
      t.timestamps
    end
  end

  def self.down
    drop_table :team_members
  end
end

Наконец, мы можем создать образец модели пространстве имен наших gem.

# CURRENT FILE :: app/models/team_page/team_member.rb
module TeamPage
  class TeamMember < ActiveRecord::Base
    attr_accessible :name , :twitter_url , :bio , :image_url
  end
end

Что мы сделали до сих пор является прошел через шаги для начальной загрузки Rails 3 двигателя драгоценный камень.Это был сконфигурирован как двигатель, учитывая его собственный генератор миграции, и поставляется с ActiveRecord model.

Теперь давайте настроим наш драгоценный камень с маршрутом, контроллер и представление, что любой хост-приложения Rails может use.

Route

Rails двигателей драгоценных камней, при правил …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.