Web Marina

日々の業務や勉強などで得た知識をアウトプットしていきます。

Rails プラグインを学んでみる。(前編)

f:id:song-of-life1352607:20170411225447p:plain

こんにちは、マリンです。

ポートフォリオサイトのスマホ化がひと段落しましたので、今度はブログ機能をつけようと思います。

せっかくなので、以前ちょこっと触れたプラグインをやってみようと思い、現在RailsガイドさんのRails プラグイン作成入門を勉強しています。

ここまでの内容を勉強ノートとしてまとめ。

PluginとEngine

本文とは少し外れますが、前回触れたのがエンジンで、今勉強中なのがプラグインで・・・

何が違うの?と思ったのでちょっと調べました。

Plugin

  • コアフレームワークを拡張したり変更したりするのに使う。

  • gemとしてビルドするので、RubygemsとBundlerを使用して他のRailsアプリケーションと共有することが可能。

Engine

  • プラグイン同様ホストアプリに機能を提供するものだが、エンジンはよりアプリに近く、ホストアプリのミニチュアのようなもの。

  • 実際にはRailsアプリの方がエンジンを拡張したようなもので、Rails::ApplicationはRails::Engineから多くの振る舞いを継承している。

・・・イマイチなんですが、

どうやらよりホストアプリ寄りなのがエンジンで、いろんなアプリで使ってもらうのを想定しているのがプラグインかな?まぁ、名前的にも。

ということは今回はエンジンのが良さそうですが、

なんとなくプラグインの方が基本ぽかったのでひとまず続けることにしました。

1 設定

gem形式のプラグインを生成する

まずはプラグインのスケルトンを作成します。

*ちなみにスケルトンは骨組みです。私はなんか透過的な意味かと思ってました。

$ rails plugin new

このコマンドはあらゆるRails拡張機能の開発用スケルトンを生成するためのものです。

ここで生成したスケルトンには、ダミーのRailsアプリが入っているので、それを使って統合テストなんかも行うことが可能です。

ちなみにこのコマンドで生成されるファイルはこちら。

      create
          create  README.md
          create  Rakefile
          create  yaffle.gemspec
          create  MIT-LICENSE
          create  .gitignore
          create  Gemfile
          create  lib/yaffle.rb
          create  lib/tasks/yaffle_tasks.rake
    
          create  lib/yaffle/version.rb
          create  bin/test
          create  test/test_helper.rb
          create  test/yaffle_test.rb
          append  Rakefile
      vendor_app  test/dummy

2 新しく生成したプラグインをテストする

テストの前に、作成したプラグインディレクトリでbundle installします。

が、さらにその前に、.gemspecファイルの"TODO"の部分を修正してください。

プラグインではgemの依存関係?などをGemfileではなく~.gemspecファイルに記述します。

デフォルトのままだとこのファイルに記述できるs.homepageやらs.summaryやらの内容が"TODO"になっており、このままだとbundle installした時にエラーになってしまうので、ここを修正してください。

その後、プラグインディレクトリにてrake testです。

ダミーアプリの中ではrails test

プラグインディレクトリではrakeです。

3 コアクラスを拡張する

ここではプラグインが使用されるRailsアプリケーションのどこでも利用可能なメソッドを追加する方法を学びます。

  • 追加先 : Stringクラス

  • 追加メソッド : to_squawk

テストファイルの作成

この教材はテスト駆動方式で進めているので、まずテストからです。

core_ext_test.rbファイルを作成し、以下のテストを書きます。

require 'test_helper'
 
class CoreExtTest < ActiveSupport::TestCase
  def test_to_squawk_prepends_the_word_squawk
    assert_equal "squawk! Hello World", "Hello World".to_squawk
  end
end

まだメソッドが実装されていないのでエラーになります。

メソッドの実装

メソッドを実装してテストが通るようにします。

<require 'yaffle/core_ext'を追加>

# lib/yaffle.rb

require 'yaffle/core_ext'

module Yaffle
end

プラグインではまずlib直下のyaffle.rb(ファイル名はそれぞれです)が呼び出されます。

そのためまずはここで呼び出して欲しいファイル名を記述。

<メソッドの実装>

# lib/yaffle/core_ext.rb

String.class_eval do
  def to_squawk
    "squawk! #{self}".strip
  end
end

前述のrequireで呼び出されるファイルにメソッドを定義します。

メソッドを使ってみる

ここまででto_squawkメソッドが使用できるようになったので、

rails consoleで試してみます。

rails consoleを実行するには、ダミーアプリに移動してください。

$ cd test
$ cd dummy
$ bin/rails console
>> "Hello World".to_squawk
=> "squawk! Hello World"

長くなってきたので、今回はここまでにします。

次は「4.“acts_as"メソッドをActive Recordに追加する」から書きます。