Настройка Web-сервера

Нужна помощь?


Вы всегда можете задать вопрос нашему специалисту и мы постараемся Вам помочь!

Руководство по запуску Rails Engine Gem

Начиная с выпуска Rails 3, разработчики написали Rails engine в новом стиле, который можно упаковать в RubyGems.  Rails engine – упакованное приложение,  которое можно запустить или установить в другом приложении Rails. Engine может иметь свои собственные модели, просмотры, котроллеры, генераторы и помогать статическим файлам.

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

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

Enginex

Jose Valim, разработчик ядра Rails, создал инструмент под названием Enginex, для базового интерфейса Rails 3 совместимый с engine gems. Этот инструмент защитит вас от многих из глюков, с которыми сталкиваются разработчики engine gem. Он обеспечивает основные настройки, в том числе для тестового приложения Rails, которое вам понадобится для запуска.

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

1
2
gem install enginex
enginex team_page
gem install enginex
enginex team_page

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

Настройка

Чтобы настроить наш gem, мы изменим несколько файлов.  Во-первых team_page.gemspec и Gemfile.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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
# 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 будут загружены зависимости, которые являются соглашениями.

Далее, чтобы превратить наш gem в Rails engine, давайте добавим или изменим три файла. Во-первых, наш файл подкачки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    # 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"
	# 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. Мы также настраиваем конфигурацию нашей gem, методом self.setup. В конце нашего файла требуем engine, для проверки зависимостей.

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

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

Наконец, файл engine:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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
# 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

Это определяет два блока инициализации Rails, которые даны в корневом каталоге нашего приложения Rails, а также управляет любыми файлами в корневом каталоге gem.

Модель данных

Для добавления модели в наш gem, мы сначала должны определить перемещение и генератор класса, чтобы скопировать его на хост приложения Rails. Нам нужно построить несколько генераторов класса. Множество способов создания можно найти в Nepal of Rails.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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
# 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 и создать необходимый файл перемещения, чтобы привести team_page в действие.

Далее соединим образцы перемещения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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
# 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.

1
2
3
4
5
6
# 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
# 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

Все что мы сделали, было шагами начальной загрузки Rails3 engine gem. Он был сконфигурирован как engine, учитывает собственный генератор перемещения и снабжен моделью ActiveRecord.

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите в систему или зарегистрируйтесь