テクノロジー
【Rails】汎用的に使えそうなgemたちまとめ
はじめに
こんにちは。23卒のT・Nです。
配属されて初めて触れたRailsについて、日々苦戦しつつ学んでいます。
この記事では、Railsで開発する上で欠かせないgemについて、汎用的なものをいくつか紹介したいと思います。
※勉強途中の若輩者です。間違っていたら優しい指摘をお願いします。
そもそもgemとは
標準のライブラリではなく、有志のすごい人たちが開発した外部ライブラリのことです。
インストールして使います。すごく便利だな〜と思いながら日々使っています。
興味がある人はコミュニティを見てください→RubyGems
紹介するgemたち
- ransack・・・検索する
- kaminari・・・ページ処理する
- view_component・・・コンポーネント
- letter_opener・・・メール見るやつ
- seed_fu・・・データ投入するやつ
- rubocop・・・コードを指摘してくれるやつ
多いです。あまりに多くて、ここに記すには余白が狭すぎるので、おおまかな機能だけを紹介しようと思います。
ちょっとだけ使用例を提示するために、TODOアプリ(仮)を作成します。まず、適当に画面を作ります。
並んでいます。すごく。
多忙な現代人です、日々管理すべきことは多いのでしょう。きっと。
積もること山の如しなタスクからたった一つを探そうなんて、大層なもんです。
効率的で優雅な画面を実現するために使用したいgemは、ransackとkaminariです。
kaminari
ページネーションを簡単に実装できます。
嬉しいところ
- ページネーションを簡単に使える
- コンテンツ数やページ表示を好きな感じにカスタマイズできる
使用例
インストールした後使いたいところのcontrollerに追記します。10個毎にページ変えたかったらこんな感じ。
def index
@tasks = Task.all.order(created_at: :desc).page(params[:page]).per(10)
end
ページ処理したいindex.html.erbに追記します。たったこれだけです。
<%= paginate @tasks %>
ransack
検索gemです。よくある検索フォームを簡単に作れます。
ransackには、シンプルモードとアドバンスモードがあります。
嬉しいところ
- 依存関係を追加することなく、Railsアプリケーションに検索を簡単に追加可能
- アドバンスモードを使うことで、複雑な検索も標準的なRubyとERBでできる
使用例
シンプルモードでの例を紹介します。
インストールした後、modelに検索対象を追加します。
class Task < ApplicationRecord
def self.ransackable_attributes(auth_object = nil)
["title"]
end
end
controllerを編集します。
def index
@q = Task.ransack(params[:q])
@tasks = @q.result(distinct: true).page(params[:page]).per(10)
end
viewは以下のように非常にベーシックな検索欄を作りました。"_cont"は、部分一致で検索させたかったので指定しています。条件を簡単につけれるのも魅力的ですね。
<%= search_form_for @q, url: tasks_path do |f| %>
<%= f.search_field :title_cont, class: 'form-control', placeholder: '検索ワード' %>
<%= f.submit '検索' %>
<% end %>
ということで、kaminariとransackを使った結果。
ちょっとだけ賢そうですね!
こんな感じで、gemを使いこなすとスマートでモダンな何らかのアプリを簡単に実現できます。
view_component
コンポーネント志向UIを実現するgemです。
コンポーネント志向UIとは、ざっくり言うと、UIを再利用可能な部品(コンポーネント)に分割する感じの、環境にやさしいSDGs精神っぽいやつです。
例えば、どの画面でも共通して使用する「ボタン」があるとします。いちいち全ページに記述するよりも、コンポーネントにして使いまわした方が幸せになれます。
嬉しいところ
- Componentベースで開発するので再利用が簡単
- テストやデバッグがしやすい
- ERBでそのまま呼べる
seed_fu
Railsには、初期データをデータベースに投入するためのseeds.rbファイルが最初から用意されています。
が、seed_fuを用いると、id(キー)を指定してレコード作成・更新ができます。
つまり、seedを実行する度に同じデータできちゃった…という事態を回避できます。
注意:seed_fuは更新が止まって久しいです。新規プロジェクトで採用するのは、できれば控えたいところです。
嬉しいところ
- seedの一部を変更した時、変更したところだけ読み込める
- 環境ごとに分けやすい
- FIXTURE_PATHやFILTERオプションをつけることでパス変更できる
- キーはid以外(ユニークであれば)も指定できる
使用例
基本的には rails db:seed_fu
でデータを投入します。
ちょっと試します。db/fixtures/seed_test.rbを作成します。
例えば、Userテーブルがあって、emailがユニークだとします。emailをキーとして指定する場合は以下の感じです。
User.seed(:email) do |s|
s.name = "me"
s.email = "me@example.com"
s.dog_name = "wanwan"
end
User.seed(:email) do |s|
s.name = "you"
s.email = "you@example.com"
s.dog_name = "wanwan"
end
実行して、データを見ます。
irb(main):001> User.all
User Load (0.1ms) SELECT "users".* FROM "users" /* loading for pp */ LIMIT ? [["LIMIT", 11]]
=>
[#<User:0x0000000103dfa328 id: 1, name: "me", email: "me@example.com", dog_name: "wanwan">,
#<User:0x0000000105817bc0 id: 2, name: "you", email: "you@example.com", dog_name: "wanwan">]
データをキー(email)で判定して、重複していた場合は「追加」ではなく「更新」となります。
例から、meの方だけ、 s.dog_nam = "w"
に変えて実行します。
irb(main):001> User.all
User Load (0.1ms) SELECT "users".* FROM "users" /* loading for pp */ LIMIT ? [["LIMIT", 11]]
=>
[#<User:0x0000000103dfa328 id: 1, name: "me", email: "me@example.com", dog_name: "w">,
#<User:0x0000000105817bc0 id: 2, name: "you", email: "you@example.com", dog_name: "wanwan">]
新規レコードは作成されずに、無事に更新できました!
letter_opener
github
アプリにメール送信を導入したとき、コンソールで確認するのって、面倒ですよね。
メール確認をするときにとても便利なgemです。
嬉しいところ
- メールのプレビュー確認を視覚的に優しくできる
- 間違えて送っちゃった!を防げる
使用例
localhost:3000/letter_opener
にアクセスすると、ブラウザ上で送信したメールの確認ができます。
ターミナルばかりを眺めるのは不健康ですから、健康的で使いやすいのは素敵ですね!
RuboCop
github
RuboCopは、ソースコードの変なところを指摘してくれるgemです。インデントや空白のミス、ふさわしくない書き方まで教えてくれます。ついでに、簡単な修正ならば、半自動的に修正してくれます。
私は毎日RuboCopに修正してもらいつつ学んでいます。
また、RuboCopは、.rubocop.ymlを編集することで、検査対象や検査項目をアレンジすることができます。
嬉しいところ
- コードの変な部分を知ることができる
- 簡単な修正をしてくれる
- 複数人がコードを書くチーム開発で導入する場合、書き方を統一できる
- Cop(検査ルール)のカスタマイズ可能
使用例
bundle exec rubocop
オプションに -a を指定すると、自動修正してくれます。ちなみに修正オプションは、
- a ... safeとマークされたCopのみ修正
- A ... unsafeも含めて全てのCopを修正
とありますが、個人的には、commit → bundle rubocop -A → git diffで確認するのがいいのかなと思っています。
おわりに
非常に雑多になりましたが、以上でgem紹介は終わります。
これからも色々試して、環境にやさしい素敵なRailsライフを送れるよう、精進していきたいと思います。
※本記事は2023年12月時点の内容です。