【Rails入門】初心者が知っておくべき3つのgem

こんにちは! フリーエンジニアの長瀬です。

みなさんはどんなgemを使っていますか?

gemを適材適所で使いこなせるようになれば、開発効率を大幅に上げることができます。

この記事では初心者が知っておくべきgemについて

・Rspec
・Kaminari
・Hirb

という順序で、1つ1つ簡単な実装方法を紹介しながら解説していきます。

どれも初心者が知っておくべきgemなので基本的な使い方を把握しておきましょう。

目次

Rspec

Rspecとは

RspecはRailsでテストをするためのgemで、RailsでテストといえばこのRspecです。

Minitestもありますが、Rspecのほうがユーザーが多く、ソースも豊富です。

Rspecを導入することで、簡単にテスト環境を構築することかできます。

テストは学校の試験とかそういうものではなくて、プログラミングでのテストはコードが期待した通りに動いているのかをチェックすることです。

テストを導入すれば、未然にバグを防げるのでより確実なプログラムを組んでいくことができます。

Rspecで簡単なテストをする方法

それでは、Rspecを使って簡単なテストをしてみましょう。

Rspecを使うために最低限のgemをインストールしておきます。

まずはgemfileに今回使用するgemを記述していきましょう。

Gemfileに以下のコードを入力してください。
[Gemfileに追加する内容]

group :development, :test do
  gem 'rspec-rails', '~> 3.4'
end

group :test do
  gem 'database_cleaner', '~> 1.5’
end

開発、テスト環境のグループにrspec-railsを、そしてテスト環境のところにdatabase_cleanerを追加してください。

Gemfileに記述できたら、コマンドプロンプトにてbundle installをして、gemをインストールしてください。

次に、Rspecの初期設定をします。

コマンドプロンプトに以下のコードを入力してください。
[Rspecを初期化する]

rails generate rspec:install

[実行結果]

   create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

これで、Rspecで使用する基本的なファイルが自動的に作成されます。

次に、database_cleanerのgemもインストールしたので、初期設定を行います。

database_cleanerはテストのたびにデータベースを初期化してくれるgemです。

もしも、初期化されなかったらテストデータなのに、そのまま残ってしまいますよね?

それを防ぐためにdatabase_cleanerを使います。

app/spec/support/database_cleaner.rbを作成して以下のコードを入力してください。(supportフォルダとdatabase_cleaner.rbファイルは手動で作成してください。)

[app/spec/support/database_cleaner.rbに記述する内容]

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

これで、テストのたびにデータベースを初期化してくれます。

では、実際にモデルのテストを実装してみましょう。

今回使用するモデルを作成するためにコマンドプロンプトに以下のコードを入力してください。
[モデルを作成する]

rails g model Post title:string content:text
rake db:migrate

[実行結果]

     create    db/migrate/20170719044222_create_posts.rb
      create    app/models/post.rb
      invoke    rspec
      create      spec/models/post_spec.rb

すでにrspecが有効になっているので、spec/models/post_spec.rbが自動的に作成されたことを確認できます。

それでは、実際にテストをしてみましょう。

spec/models/post_spec.rbの内容をすべて削除してから以下のコードを入力してください。

[spec/models/post_spec.rbに記載する内容]

require 'rails_helper'

describe Post do
  it "is valid with title and content" do
    post = Post.new(
      title: '美味しい野菜の育て方',
      content: '今回はじゃがいもを〜'
    )
    expect(post).to be_valid
  end
end

このテストは、さきほど作成したPostモデルのtitle、contentカラムに値が入っているかチェックするものです。

このコードでは、Post.new以下でtitle,contentに値をいれているので、テストを通過します。

では、テストを実行してみましょう。
コマンドプロンプトに以下のコードを入力してください。

[post_spec.rbに記述したテストを実行する]

rspec spec/models/post_spec.rb

[実行結果]

Finished in 0.0123 seconds (files took 2.53 seconds to load)
1 example, 0 failures

1 example, 0 failuresは、テスト1個に対してテストに失敗したのは0個だったという意味です。

つまり、今回はテストをパスしています。

では、次にspec/models/post_spec.rbを修正してテストに失敗するようにしてみましょう。

require 'rails_helper'

describe Post do
  it "is valid with title and content" do
    
    expect(post).to be_valid
  end
end

あえて、失敗させるために、Post.new以下を削除しました。

そしてもう一度テストを実行してみましょう。
コマンドプロンプトに以下のコードを入力してください。

[post_spec.rbに記述したテストを実行する]

rspec spec/models/post_spec.rb

[実行結果]

Finished in 0.00787 seconds (files took 2.98 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/models/post_spec.rb:4 # Post is valid with title and content

1 example, 1 failure変わり、テスト1個に対してテストに失敗したのは1個という結果になります。

Postのtitleとcontentに値が入っているのかテストできていることを確認できました。

今回紹介したものはRspecの基本的な機能のほんの一部で、少しでもRspecでテストをする感覚を味わっていただくためのものです。

Rspecを使ったテストの種類は数多くありますので、これを機にRspecでどんなテストができるのか調べてみましょう。

Kaminari

Kaminariとは

KaminariはRailsでページネーションを実現するためのものです。

ページネーションとは、たくさんのデータをページごとに分割して表示することです。

自分で初めからページネーションを実装していくのは手間がかかりますが、Kaminariを使えば簡単にできます。

言葉で説明するよりも、見た方が理解が早いので、早速簡単でサンプルコードで実装してみましょう。

Kaminariでページネーションする方法

それではページネーションを設定していきましょう。

今回はscaffoldを使用して実装していきます。
scaffoldの使い方がよくわからない方はこちらの記事を参考にしてください。

今回使用するモデルを作成するためにコマンドプロンプトに以下のコードを入力してください。
[scafffoldでBookモデルを作成する]

rails g scaffold Book name:string

モデルを作成したので、rake db:migrateとコマンドプロンプトに入力してデータベースに反映してください。

次に今回使用するデータを追加していきます。

db/seeds.rbに以下のコードを追加してください。

[db/seeds.rbに追加する内容]

100.times do |number|
  Book.create(:name => "侍歴史伝第#{number+1}巻")
end

それではrake db:seedを入力して、db/seeds.rbで記述した内容をデータベースに反映してください。

100件のデータの登録を確認できます。

続いて、結果を確認するためにコマンドプロンプトにrails sと入力して、サーバーを起動してください。

scaffoldではresourcesでソースが割り当てられています。

以下のURLにアクセスして、index.html.erbを開いてください。

http://localhost:3000/books

(補足http://localhost:3000の箇所は各自の開発環境により読み替えてください。)

Screen Shot 2560-07-19 at 21.46.37

このように、1ページに100件のデータが表示されるのを確認できます。

1ページに100件表示するのは多いので、ページネーションを設定して分けてみましょう。

それでは、今回scaffoldで作成されたapp/views/books/index.html.erbのコードを以下のように修正してください。

[app/views/books/index.html.erbを修正する]

<p id="notice"><%= notice %></p>
<h1>Books</h1>

<%= page_entries_info @books %>

<table>

(中略)

</table>


<%= link_to 'New Book', new_book_path %>

<%= paginate @books %>

次に、コントローラーを設定していきます。

app/controllers/books_controller.rbを開いてindexアクションの内容を以下のようにコードを修正してください。

[app/controllers/books_controller.rbのindexを修正する]

  def index
      @books = Book.page(params[:page])
    end

これでページネーションの設定が一通り終わりました。

もう一度、rails serverでサーバーを開いて、確認してみましょう。

http://localhost:3000/books

Screen Shot 2560-07-19 at 21.47.05

このように100件すべて表示されていたのが分割されているのを確認できます。

また、1ページに表示されるのを標準設定の25から他の数値に変えたい場合などKaminariでは詳細設定を変更できます。

Kaminariの詳細設定については本家Githubを確認してください。

参照元:Github kaminari

General Configuration Optionsにオプション設定の項目に詳細設定をする方法が記載されています。

Hirb

Hirbとは

初期設定ではrails consoleでコンソールを使用したときにデータを取り出そうとすると、見慣れている表形式で出力されないので不便です。

そこで、Hirbのgemを使えば、表形式で出力するように簡単に設定できます。

少しデータを確認したいときなど、意外にコンソールにお世話になることは多いです。

なので、積極的にコンソールはカスタマイズしておきましょう。

Hirbで出力結果を変更する方法

では実際にHirbを使ってみましょう。

今回kaminariのところで作成したBookモデルからデータ出力します。

rails consoleでコンソールを起動した後、以下のコードを入力してください。
[コンソールでBookテーブルからデータを出力する]

Book.limit(5)

[実行結果]

Book Load (0.2ms)  SELECT  "books".* FROM "books" LIMIT ?  [["LIMIT", 5]]
 => #<ActiveRecord::Relation [#<Book id: 1, name: "侍歴史伝第1巻", created_at: "2017-07-19 12:34:42", updated_at: "2017-07-19 12:34:42">, #<Book id: 2, name: "侍歴史伝第2巻", created_at: "2017-07-19 12:34:42", updated_at: "2017-07-19 12:34:42">, #<Book id: 3, name: "侍歴史伝第3巻", created_at: "2017-07-19 12:34:42", updated_at: "2017-07-19 12:34:42">, #<Book id: 4, name: "侍歴史伝第4巻", created_at: "2017-07-19 12:34:42", updated_at: "2017-07-19 12:34:42">, #<Book id: 5, name: "侍歴史伝第5巻", created_at: "2017-07-19 12:34:42", updated_at: "2017-07-19 12:34:42">]>

このように表形式ではないので、非常に読みづらいデータが出力されます。

ではHirbを設定して出力を表形式へと変更していきましょう。

まずはGemfileに以下に以下のコードを追加してください。

[Gemfileに追加する内容]

gem 'hirb'   # モデルの出力結果を表形式で表示するGem
gem 'hirb-unicode' # 日本語などマルチバイト文字の出力時の出力結果のずれに対応

では、コマンドプロンプトでbundle installを入力してgemファイルをインストールしてください。

インストールが完了したら、再びrails consoleでコンソールを起動した後、以下のコードを入力してください。

[Hirbを使ってコンソールでBookテーブルからデータを出力する]

Hirb.enable #Hirbを有効にする
Book.limit(5)

[実行結果]

 Book Load (0.3ms)  SELECT  "books".* FROM "books" LIMIT ?  [["LIMIT", 5]]
+----+---------------+---------------------------+---------------------------+
| id | name          | created_at                | updated_at                |
+----+---------------+---------------------------+---------------------------+
| 1  | 侍歴史伝第1巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 2  | 侍歴史伝第2巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 3  | 侍歴史伝第3巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 4  | 侍歴史伝第4巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 5  | 侍歴史伝第5巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
+----+---------------+---------------------------+---------------------------+
5 rows in set

このように、表形式で表示され、データが見やすくなりました。

pryを使ってHirb.enableを自動化する

これでHirbを使って表形式でデータを出力できるようになりましたが、毎回コンソールを開くたびにHirb.enableを入力するのは手間がかかります。

プログラマーとしては毎回同じ動作を手作業でするという無駄はできれば避けたいです。

なので、コンソールを標準のirbからpryに変更してHirb.enableが毎回コンソール起動時に読み込まれるように設定してみましょう。

まずは、コンソールを標準のirbからpryに変更するためGemfile内の開発・テスト環境に以下のコードを追加してください。

[Gemfileに追加する内容]

group :development, :test do
  gem 'pry-rails'  # irbの代わりにpryにする
end

では、コマンドプロンプトでbundle installを入力してgemファイルをインストールしてください。

インストールが完了したら、Hirb.enableを自動化するために、ルートディレクトリ下に.pryrcという設定ファイルを作成しましょう。(GemfileやGemfile.lockがある場所と同じ場所です。)

そして作成された.pryrcに以下のコードを追加してください。

[Hirb.enableを自動化するために.pryrcに追加する内容]

 begin
   require 'hirb'
 rescue LoadError
 end

 if defined? Hirb
   Hirb::View.instance_eval do
     def enable_output_method
       @output_method = true
       @old_print = Pry.config.print
       Pry.config.print = proc do |*args|
         Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
       end
     end

     def disable_output_method
       Pry.config.print = @old_print
       @output_method = nil
     end
   end

   Hirb.enable
 end

これで設定が完了しました。

rails consoleでコンソールを起動した後、もう一度以下のコードを入力してください。

[Hirbを使ってコンソールでBookテーブルからデータを出力する]

Book.limit(5)

[実行結果]

 Book Load (0.3ms)  SELECT  "books".* FROM "books" LIMIT ?  [["LIMIT", 5]]
+----+---------------+---------------------------+---------------------------+
| id | name          | created_at                | updated_at                |
+----+---------------+---------------------------+---------------------------+
| 1  | 侍歴史伝第1巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 2  | 侍歴史伝第2巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 3  | 侍歴史伝第3巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 4  | 侍歴史伝第4巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
| 5  | 侍歴史伝第5巻 | 2017-07-19 21:34:42 +0900 | 2017-07-19 21:34:42 +0900 |
+----+---------------+---------------------------+---------------------------+
5 rows in set

このように、Hirb.enableを毎回入力しなくても,表形式で出力できるように設定できました。

まとめ

いかがでしたでしょうか?

この記事では、初心者に知っておくべきgemを3つ解説しました。

今回紹介したものはどれもRailsでの開発の強力な武器になります。

この記事では,簡単な導入しか説明しませんでしたが、これを機にそれぞれのgemの使い方をマスターしてみてはいかがでしょうか?

Railsには今回紹介したもの以外にも数え切れないほどたくさんのgemがあります。

gemを使いこなせれば、開発効率があがるのでたくさんのgemを操れるように学習していきましょう。

この記事を書いた人

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。

目次