Rails Diary

プログラミングの学習記録です。

権限のプルダウン(メモ書き)

権限のプルダウンを作るために調べたことまとめ

ransack軽く復習

ransackは検索機能を実装できるgem

コントローラ

# ビューファイルから送られてくるパラメータqをもとにテーブルからデータを検索する
# whereメソッドのransack版なイメージ
@q = User.ransack(params[:q])

# ransackメソッドで取得したデータをresultメソッドを用いてActiveRecord_Relationのオブジェクトに変換する
@results = @q.result

ビュー

<!-- ransackで定義されているsearch_form_forメソッドを用いる -->
<%= search_form_for @q, url: ○○_path do |f| %>
  <%= f.label :name_cont, 'ユーザー名'%>
  <%= f.search_field :name_cont %>
<!-- 文字入力であればtext_field、数値入力であればnumber_fieldでも可 -->

  <%= f.submit '検索'%>
<% end %>

_contメソッド

ransackで用意されているメソッド
検索したワードが含まれているレコードを取得するためのメソッド。

name_contと、_の前に指定したカラムに対してあいまい検索(検索したワードが含まれたデータが取得)される

_eq

完全に一致する検索結果を表示したい場合に用いる。

name_eqのように記述

詳細に検索をかける

<%= search_form_for @q, url: ○○_path do |f| %>
  <%= f.label :name_cont, 'ユーザー名'%>
  <%= f.search_field :name_cont %>
<!-- 年齢を検索するフォームも追加 -->
  <%= f.label :age_eq, '年齢' %>
  <%= f.number_field :age_eq %>
  <%= f.submit '検索'%>
<% end %>

セレクトボックスを作成する

f.seletcでセレクトボックスを作ることができる

<%= form_with model: @user, url: ○○_path, do |f| %>
 <%= f.select :role_eq, User.roles_i18n.invert.map{|key, value| [key, User.roles[value]]}, { include_blank: t('defaults.unspecified') }, { class: 'form-control mr-1' } %>

どう使うのか、
見慣れないものがたくさんついている。。。

まず、_18nって何?

【Rails】enumをI18n対応させるenum_helpが便利すぎた - ひよっこエンジニアの雑多な日記

enumI18n対応させるために用いるenum_helpジェムをインストールすることで使える

enum
class User < ActiveRecord::Base
  enum role: { general: 0, admin: 1 }
end
# roleカラムに入っている数値によって値が定数名が表示される
# roleが0の場合
user.role
=> "general"

この文字列を日本語で表示させたい時に用いるのがコレ!

gem 'enum_help'

翻訳ファイルに追加

ja:
  enum:
    user:
      role:
        general: '一般'
        admin: '権限'

呼び出す際、末尾に_18nを付ける

# roleカラムの値が0の場合
user.role_i18n
=> "一般"
invert

enum_helpによって使えるヘルパー

User.roles_i18n.invert
=> {"一般"=>"general", "管理者"=>"admin"}

以上を踏まえてセレクトボックスについて

<%= f.select :role_eq, User.roles_i18n.invert.map{|key, value| [key, User.roles[value]]}, { include_blank: t('defaults.unspecified') }, { class: 'form-control mr-1' } %>
<!-- <%= f.select :カラム名, セレクトボックス表示に使うデータ配列orハッシュ, {オプション},{HTMLオプション}%> -->

セレクトボックスの表示に使うデータ配列orハッシュ

% rails c
irb(main):009:0> User.roles
=> {"general"=>0, "admin"=>1}
irb(main):010:0> User.roles_i18n
=> {"general"=>"一般", "admin"=>"権限"}
irb(main):011:0> User.roles_i18n.invert
=> {"一般"=>"general", "権限"=>"admin"}
irb(main):012:0> User.roles_i18n.invert.map{|key, value| [key, User.roles[value]]}
=> [["一般", 0], ["権限", 1]]

↑二次元配列というやつが出来上がった。

セレクトボックスの表示に使うデータはこの二次元配列を使う。必ず配列かハッシュを指定する。

オプション

セレクトボックスのオプション

{ include_blank: true, selected: 0 }
  • include_blank: 先頭を空の選択肢にする
  • selected: デフォルトで選択しておきたい値を設定

include_blank: ここに文字を入れると先頭の選択肢名が入る https://i.gyazo.com/de33f577dd6d24f59976464920db3311.mp4

HTMLオプション

selectタグにid, classオプションを指定したい時に使う

{ class: 'form-control mr-1' }

※ 必ず通常のオプションを設定しない場合でも空の波括弧{},をオプション部分に設定すること
※ これがないと、HTMLオプションが無視される

localizeメソッド (i18n主要メソッド)

日時や時刻を設定した言語のフォーマットに変換する https://pikawaka.com/rails/i18n

rails-18nのgemをインストール済みなので、所定の翻訳を参照してくれる

irb(main):001:0> Date.today
=> Sat, 12 Mar 2022
irb(main):002:0> Time.now
=> 2022-03-12 20:44:53 +0900
irb(main):003:0> I18n.l(Date.today)
=> "2022/03/12"
irb(main):004:0> I18n.l(Time.now)
=> "2022年03月12日(土) 20時45分24秒 +0900"

default以外のフォーマットを指定する場合はI18n.l()の第二引数にformat: :○○と指定する。

ja:
  activerecord:
    errors:
      messages:
       # 中略
  date:
       # 中略
    formats:
      default: "%Y/%m/%d"
      long: "%Y年%m月%d日(%a)"
      short: "%m/%d"

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

irb(main):005:0> I18n.l(Date.today, format: :long)
=> "2022年03月12日(土)"
irb(main):006:0> I18n.l(Date.today, format: :short)
=> "03/12"

irb(main):007:0> l(Date.today, format: :short)
Traceback (most recent call last):
        1: from (irb):7
NoMethodError (undefined method `l' for main:Object)

※ コンソールでは先頭のi18nの記載が必要だが、コントローラやビューファイルでは省略可◎

<%= @board.created_at %>

https://i.gyazo.com/5e3adf75542e3d7f46efb5a79a5c3f1e.png
直感的に分かりづらい表示

<%= l @board.created_at, format: :long %>

https://i.gyazo.com/92495cac717b322b3f2ba07f9cd0c0fa.png
見やすい!!

参考にしたサイト

セレクトボックス

【Rails】完全理解 formでセレクトボックスをつくるselectの使い方 | WEB屋のメモ帳

ransack

【Rails】 ransackを使って検索機能がついたアプリを作ろう! | Pikawaka

enumi18n対応

【Rails】enumをI18n対応させるenum_helpが便利すぎた - ひよっこエンジニアの雑多な日記

localizeメソッドについて

【Rails】 I18n入門書~日本語化対応の手順と応用的な使い方 | Pikawaka