수색…


소개

Rails 엔진에 대한 간략한 개요

엔진은 호스팅하는 애플리케이션에 기능을 추가하는 데 사용할 수있는 소형 Rails 애플리케이션입니다. Ruby on Rails 애플리케이션을 정의하는 클래스는 실제로 엔진을 정의하는 클래스 인 Rails::Engine 에서 많은 동작을 상속받는 Rails::Application 입니다. 레일스 애플리케이션은 단순히 더 많은 기능을 갖춘 엔진이라고 말할 수 있습니다.

통사론

  • 레일스 플러그인 new my_module --mountable

모듈 식 앱 만들기


# 시작하기

먼저 새로운 Ruby on Rails 애플리케이션을 생성 해 보겠습니다.

rails new ModularTodo

다음 단계는 엔진을 생성하는 것입니다!

cd ModularTodo && rails plugin new todo --mountable

우리는 엔진을 저장하기위한 '엔진'폴더도 만들 것입니다 (우리가 가지고있는 엔진이라 할지라도!).

mkdir engines && mv todo ./engines

보석과 마찬가지로 엔진은 보석 파일과 함께 제공됩니다. 경고를 피하기 위해 실제 가치를 두자.

 #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


이제 부모 응용 프로그램 Gemfile에 Todo 엔진을 추가해야합니다.

#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 에서 액세스 할 수도 있습니다. 우리는 단 하나의 모듈을 가지고 있기 때문에, / 괜찮습니다.

이제 서버를 가동하여 브라우저에서 확인할 수 있습니다. 아직 컨트롤러 / 뷰를 정의하지 않았기 때문에 기본 레일스 뷰를 볼 수 있습니다. 이제하자!

Todo 목록 만들기

우리는 Todo 모듈 내에서 Task 라는 모델을 스캐 폴딩하려고하지만 부모 애플리케이션에서 데이터베이스를 올바르게 마이그레이션하기 위해 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