Ruby on Rails
Railsエンジン - モジュール式レール
サーチ…
前書き
Railsエンジンの概要
エンジンは、それをホストするアプリケーションに機能を追加するために使用できる小さなRailsアプリケーションです。 Ruby on Railsアプリケーションを定義するクラスがあるRails::Application
実際から、その行動の多くを継承するRails::Engine
、エンジンを定義するクラス。通常のRailsアプリケーションは、より多くの機能を備えた単なるエンジンであると言えます。
構文
- レールプラグインnew my_module --mountable
モジュラーアプリを作成する
# 入門
まず、新しいRuby on Railsアプリケーションを生成しましょう。
rails new ModularTodo
次のステップは、エンジンを生成することです!
cd ModularTodo && rails plugin new todo --mountable
エンジンを格納するための「エンジン」フォルダも作成します(たとえそれがあったとしても!)。
mkdir engines && mv todo ./engines
エンジンは、宝石のように、gemspecファイルが付属しています。警告を避けるためにいくつかの実際の値を入れてみましょう。
#ModularTodo/engines/todo/todo.gemspec
$:.push File.expand_path("../lib", __FILE__)
#Maintain your gem's version:
require "todo/version"
#Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
s.name = "todo"
s.version = Todo::VERSION
s.authors = ["Thibault Denizet"]
s.email = ["[email protected]"]
s.homepage = "//samurails.com"
s.summary = "Todo Module"
s.description = "Todo Module for Modular Rails article"
s.license = "MIT"
#Moar stuff
#...
end
これで、Todoエンジンを親アプリケーションのGemfileに追加する必要があります。
#ModularTodo/Gemfile
#Other gems
gem 'todo', path: 'engines/todo'
bundle install
実行しましょう。宝石のリストには以下が表示されます:
Using todo 0.0.1 from source at engines/todo
素晴らしいです、私たちのTodoエンジンが正しくロードされています!コーディングを開始する前に、最後にTodoエンジンをマウントします。親アプリ内のroutes.rbファイルでこれを行うことができます。
Rails.application.routes.draw do
mount Todo::Engine => "/", as: 'todo'
end
/
マウントしていますが、 /todo
にアクセスできるようにすることもできます。モジュールは1つしかないので、 /
は問題ありません。
今すぐあなたのサーバーを起動し、あなたのブラウザで確認することができます。まだコントローラ/ビューを定義していないので、デフォルトのRailsビューが表示されるはずです。今すぐやろう!
Todoリストの作成
私たちはTodoモジュールの中でTask
という名前のモデルをengine.rb
しようとしていますが、親アプリケーションからデータベースを正しく移行するために、小さな初期化子をengine.rb
ファイルに追加する必要があります。
#ModularTodo/engines/todo/lib/todo/engine.rb
module Todo
class Engine < ::Rails::Engine
isolate_namespace Todo
initializer :append_migrations do |app|
unless app.root.to_s.match(root.to_s)
config.paths["db/migrate"].expanded.each do |p|
app.config.paths["db/migrate"] << p
end
end
end
end
end
それで、親アプリケーションからマイグレーションを実行すると、Todoエンジンのマイグレーションもロードされます。
Task
モデルを作成しましょう。 scaffold
コマンドはエンジンフォルダから実行する必要があります。
cd engines/todo && rails g scaffold Task title:string content:text
親フォルダから移行を実行します。
rake db:migrate
さて、Todoエンジンの内部でルートルートを定義するだけです。
#ModularTodo/engines/todo/config/routes.rb
Todo::Engine.routes.draw do
resources :tasks
root 'tasks#index'
end
あなたはそれで遊ぶことができる、タスクを作成する、それらを削除する...ああ待って、削除が動作していません!なぜ?! JQueryが読み込まれていないようですので、エンジンのapplication.js
ファイルに追加しましょう!
// ModularTodo/engines/todo/app/assets/javascripts/todo/application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
さて、私たちは仕事を破壊することができます!