基礎編23

[管理画面]掲示板/ユーザのCRUD機能の作成

参考

ransackで検索機能を実装 - Ruby on Railsの備忘録

Admin-LTE3を使用した管理画面の実装③(掲示板/ユーザーのCRUD) - プログラミング学習 備忘録

 

 

enum_heplを使用し、セレクトボックスを実装する

参照: 

Admin-LTE3を使用した管理画面の実装③(掲示板/ユーザーのCRUD) - プログラミング学習 備忘録

enum0を一般、1を管理者 のように数字を何かしらの値と紐付け流ことができる。

enum role: { general: 0, admin: 1 }

とすることで、

f:id:mmm_st:20210413150008p:plain

このような形で使用することができる。

 

enum_help:  ↑をgeneralを日本語に対応させる

❶ Gem.fileに記入

❷ $ bundle install

❸ localファイルに記入

(config/locales/activerecord/ja.yml)

ja:
enums:
user:
role:
general: '一般'
admin: '管理者'

❹呼び出す

f:id:mmm_st:20210413150551p:plain

このような形で使用できる。

 

*便利ヘルパーを使用することができるようになる 下で詳しく解説

f:id:mmm_st:20210413150941p:plain

 

<今回の実装>

権限選択画面について分解して考える

<%= f.select :role_eq, User.roles_i18n.invert.
map{|key, value| [key, User.roles[value]]},
{include_blank: '選択しない'}, {class: 'form-control mr-1'} %>

 

❶ここの部分について

User.roles_i18n.invert.map{|key, value| [key, User.roles[value]]}

 

まずenum_helpを使用する前のコード

<%= f.select :role_eq, User.role.values %>

f:id:mmm_st:20210414093121p:plain

 

enum_helpを使用することで...

<%= f.select :role_eq, User.roles_i18n.values %>

日本語化することができる

f:id:mmm_st:20210414093427p:plain

だが...このコードだと、発行されるSQLが常に "role" = 0となってしまい、正常に作動しない。

原因→ransackがそもそもenumに対応していないから。

解決法→invertメソッドとmapメソッドを組み合わせて正しく動きようにする。

 

f:id:mmm_st:20210414094359p:plain

invertメソッド: キーと値を組み替える

[Ruby] 便利な組み込みクラスのメソッド達(Hash編) - Qiita

 

f:id:mmm_st:20210414094409p:plain

一般管理者keygeneral adminvalueにそれぞれ代入され、mapメソッドによって処理されている。

mapの中の|key, value| [key, User.roles[value]]によって

key = key →key = 一般 管理者

value= User.roles[value] → value = 0,1 ↓下の画像を見ればわかると思う。

f:id:mmm_st:20210414095210p:plain

 

この結果一般タブが選択されると、calue="0"管理者タブが選択されるとvalue="1"が選択され、正常に動くようになる!

 

❷オプションについて

:include_blank

値をtrueにすると空白になり、文字列にするとその文字列が使用される。

{include_blank: '選択しない'}

参照

[Rails 4.x] FormのSelect プルダウンメニューの項目をDBから引っ張ってくる方法 - Qiita

 

 

 

ransackの検索機能

掲示板一覧画面に日付の検索機能を追加したい。

参照

ransackを使って日付検索&プルダウン選択する - Ruby on Rails Learning Diary

ransackで検索機能を実装 - Ruby on Railsの備忘録

「2020年4月1日から2020年4月3日までに作成された掲示板」のように日付を指定して掲示板を検索したい。

ransackのpredicateとは?

github.com

gteq : 以上

lteq : 以下

これを使用すれば実装できそうだが、これで実装するとこのような形になるが、

<%= f.date_field :created_at_gteq %>
<%= f.date_field :created_at_lteq %>

「4月1日00時から2020年4月3日00時」となり、前日分までの検索しかできない。

「4月1日00時から2020年4月3日23時59分599999...」のような日付設定にしたい。

 

--カスタムする

github.com

上のサイトに型が載っているのでそれに合わせて書く

(config/initializers/ransack.rb)

Racsack.configure do |config|
config.add_predicate 'lteq_end_of_day' #設定するpredicateに名前をつける
arel_predicate: 'lteq' #使いたいpredicateを指定
formatter: proc { |v| v.end_of_day } #受け取った値をどうフォーマットするか
end

end_of_day: もともとあるメソッドで、1日の終わりを23:59:59にする。

end_of_day (Date) - APIdock

 

--controllerにransack用の記述をする。

(controllers.admin.boards_controller.rb)

def index
@q = Board.ransack(params[:q])
@boards = @q.result(distinct: true).includes(user).order
(created_at: :desc).page(params[:page])
end
end

 

 

--view作成

(views/admin/boards/index.html.erb)

<%= search_form_for @q, url: admin_boards_path, do |f| %>
<div class="row">
<div class="form-inline algin-items-center mx-auto">
<div class = "col-auto">
<%= f.search_field :title_or_body_cont, class: 'form-control', placehodler:
'検索' %>
#タイトルと本文から検索
</div>
<div class = "col-auto">
 
---- 今回のところ ----
#(ransack.rb)で定義したlteq_end_of_day
元からあるgteqcreated_atに結合させて使用する。
date_fieldはdata型で日付検索ができるフィールド
<%= f.date_field :created_at_gteq, include_blank: true, class: 'form-control' %>
<span>〜</span>
<%= f.date_field :created_at_lteq_end_of_day, include_blank: true,
class: 'form-control' %>
-- ここまで --
 
</div>
<div class = "col-auto">
<%= f.submit class: 'btn btn-primary', value: '検索' %>
</div>
</div>
</div>
<% end %>

 

 

日時表示

lをつけ忘れないようにする

<td><%= l user.created_at, format: :long %></td>

 

Railsはどのようにpostとpatchを判断するのか?

<%= form_with model: @board, url: admin_board_path(@board),
local: true do |f| %>

 form_withに渡しているmodelインスタンスの状態を見ている。

persisted?メソッド: 永久化されている場合はtrueを返す。= 新しいインスタンスでもなく、削除もされていなければtrueを返す。

を使用し、

true なら patch  

false  なら   post

と判断する。

 

参照

rails/persistence.rb at 8bec77cc0f1fd47677a331a64f68c5918efd2ca9 · rails/rails · GitHub