#author("2016-10-26T14:01:11+09:00","default:wikiwriter","wikiwriter")
#author("2017-03-15T15:27:52+09:00","default:wikiwriter","wikiwriter")
[[Rails]]

&tag(Rails/プラグイン);
*目次 [#q8bc3c24]
#contents

*関連ページ [#ua03319d]
-[[./チュートリアル]]…Railsガイド参照

*参考情報 [#f8651e21]
-[[Rails エンジン入門 | Rails ガイド:http://railsguides.jp/engines.html]]…ここが一番わかりやすい。
-[[使いやすくなった Rails 3.1 の Engine - passingloopの日記:http://d.hatena.ne.jp/passingloop/20110801/p1]]…Engine型プラグインの利点。
-[[Rails用のgemを作成する手順 (Rails 4.0以降) – Oh My Enter!:http://www.ohmyenter.com/how-to-make-a-gem-for-rails/]]…Engine型プラグインを作成する手順。
-[[Gem、Railtieプラグイン、Engine(full/mountable)の違いとそれぞれの基礎情報 - Qiita:http://qiita.com/kidach1/items/565c2c077ae8d15fe3a8]]…プラグインの違い。
-[[rails pluginコマンドで簡単に出来るgemの作成方法。 - Qiita:http://qiita.com/camelmasa/items/44ceb6ea1a3c727bc567]]…mountableでcssを追加するプラグインの例。
-[[Rails pluginでengineを使ったgemの作り方[5](view helper編) | joppot:https://joppot.info/2015/08/09/2594]]…シンプルな例

*概要 [#x48343de]
-プラグインの種類、下に行くほど複雑っぽいがmountable型が主流?
--Railtie型: 
--Engine型: 
--Mountable Engine型: [[Devise:https://github.com/plataformatec/devise]]
-cssを一個追加するようなプラグインをmountableでつくる例もあるし。

*作成 [#l98d448e]

**mountable型の作成 [#h0335811]
***プロジェクトの作成 [#k3f40a79]
-以下のコマンドを実行
 bundle exec rails plugin new ~/work/blorgh --mountable --skip-bundle
-blorgh.gemspecを編集してTODOを削除したあと、bundle installの実行
  bundle install --path=vendor/bundle

***Articleリソースの作成 [#d01f6ff6]
-以下のコマンドを実行
 bundle exec bin/rails generate scaffold article title:string text:text
-モデルやコントローラーにネームスペースが付与されていることに注意。
#pre{{
$ bundle exec bin/rails generate scaffold article title:string text:text
      invoke  active_record
      create    db/migrate/20161025072006_create_blorgh_articles.rb
      create    app/models/blorgh/article.rb
      invoke    test_unit
      create      test/models/blorgh/article_test.rb
      create      test/fixtures/blorgh/articles.yml
      invoke  resource_route
       route    resources :articles
      invoke  scaffold_controller
      create    app/controllers/blorgh/articles_controller.rb
      invoke    erb
      create      app/views/blorgh/articles
      create      app/views/blorgh/articles/index.html.erb
      create      app/views/blorgh/articles/edit.html.erb
      create      app/views/blorgh/articles/show.html.erb
      create      app/views/blorgh/articles/new.html.erb
      create      app/views/blorgh/articles/_form.html.erb
      invoke    test_unit
      create      test/controllers/blorgh/articles_controller_test.rb
      invoke    helper
      create      app/helpers/blorgh/articles_helper.rb
      invoke      test_unit
      invoke  assets
      invoke    js
      create      app/assets/javascripts/blorgh/articles.js
      invoke    css
      create      app/assets/stylesheets/blorgh/articles.css
      invoke  css
      create    app/assets/stylesheets/scaffold.css
}}
-miration実行
 bundle exec rake db:migrate
-test/dummyディレクトリで実行。http://localhost:3000/blorgh/articlesでアクセスできる。
 bundle exec rails s

***Commentリソースの生成 [#t6b759ed]
-記事1に対して複数のコメントがつけられる。
-以下のコマンドを実行。
#pre{{
$ bundle exec bin/rails generate model Comment article_id:integer text:text
      invoke  active_record
      create    db/migrate/20161025073042_create_blorgh_comments.rb
      create    app/models/blorgh/comment.rb
      invoke    test_unit
      create      test/models/blorgh/comment_test.rb
      create      test/fixtures/blorgh/comments.yml
}}
-migration実行
 bundle exec rake db:migrate
-以下の概略。app/views/blorgh/articles/show.html.erbにコメント一覧とコメント追加用のフォームを追加する。
*Tips [#e33396a5]

**engine側のApplicationHelperをアプリ側で使用する [#f77fa9e2]
-[[Using Rails 4 engine/plugin helpers across your entire app – Carlos Roque:http://www.carlos-roque.com/2015/02/19/using-rails-4-engineplugin-helpers-across-your-entire-app/]]
#pre{{
class ApplicationController < ActionController::Base
  # your code
  helper Paginas::ApplicationHelper

  # your other code
end
}}
-アプリ側のApplicationControllerにhelperメソッドを使って追加する。こうすることでview側でだけメソッドが追加される。

**テストする [#p1d3937d]
**開発・テストする [#p1d3937d]
-mountableエンジンの場合、test/dummyディレクトリが存在しそこでダミーのアプリケーションを作成してテストすることができる。
 cd test/dummy
 bundle exec rails s
-ただしscaffoldを実行すると、test/dummy/test以下にテストが作られてしまうがこれではだめ。作成されたテスト群はtest以下に移動する。そうしないとfixtureも読み込めなくなってしまう。


**IntelliJで開発する [#d33ef974]
-新規Railsプロジェクトを作成し、既存のプラグインフォルダを選択する(単に開いただけはだめ)。
-デバッグする場合、Dummy appでtest/dummyを指定する。[[Defining the Path to the Dummy Application:https://www.jetbrains.com/help/ruby/2016.3/defining-the-path-to-the-dummy-application.html]]。ただし上記方法でRailsプロジェクトを指定した場合自動的に設定されるようだ。
*トラブルシューティング [#ye1834c8]

**IntelliJ/RubyMineでプラグインのメソッドが自動補完されない [#q9f9513f]
-単に入力しているだけだと補完されない。
-Ctrl+Spaceを押して「No Suggestions」と表示されあと、もう一回Ctrl+Spaceを押す。

**Uninitialized Constantsのエラーが発生 [#b34a59de]
-なぜかdevelopment環境では発生せず、production環境で発生。
-原因は名前空間とファイルの位置関係が一致していなかったから?
-mountableのモデルはapp/models/my_engine/article.rbのように配置して、article.rbは次のように作る
#pre{{
module MyEngine
  class Article
  end
end
}}

**Engineの初期化処理 [#xdc0aa0f]
-標準クラスを拡張したり小細工したいときはActiveSupport.on_load :action_viewなどで小細工しないといけないかもしれない。しかしそれが不要ならわざわざそこでやる必要はない。
-app以下のファイルは自動で読み込まれるし、lib以下のユーティリティは自分でEngineのメインファイルにrequireしてしまえば良い。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS