С 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 двигателей драгоценных камней, при правил …
Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров