#author("2016-10-26T00:28:53+09:00","default:wikiwriter","wikiwriter") [[Rails]] &tag(Rails/プラグイン); *目次 [#q8bc3c24] #contents *関連ページ [#ua03319d] *参考情報 [#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側でだけメソッドが追加される。 *トラブルシューティング [#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してしまえば良い。