サーチ…


前書き

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 .

さて、私たちは仕事を破壊することができます!



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow