スライドショー

【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を毎回入力しなくても,表形式で出力できるように設定できました。

Railsを独学で頑張っているけど先が見えない方のために

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRailsを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料体験レッスンを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料体験レッスンがぴったりだと断言できます。それくらい無料体験レッスンに自信を持っているのです。

さらに、無料体験レッスンには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料体験レッスン特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料体験レッスン予約はこちら

まとめ

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

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

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

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

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

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

長瀬来

長瀬来

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

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

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

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

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

趣味は語学、読書です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説