権限のプルダウン(メモ書き)
権限のプルダウンを作るために調べたことまとめ
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が便利すぎた - ひよっこエンジニアの雑多な日記
enumをI18n対応させるために用いる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 %>
<%= l @board.created_at, format: :long %>
参考にしたサイト
セレクトボックス
【Rails】完全理解 formでセレクトボックスをつくるselectの使い方 | WEB屋のメモ帳
ransack
【Rails】 ransackを使って検索機能がついたアプリを作ろう! | Pikawaka
enumのi18n対応
【Rails】enumをI18n対応させるenum_helpが便利すぎた - ひよっこエンジニアの雑多な日記