-
Notifications
You must be signed in to change notification settings - Fork 71
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
管理ページに、ユーザーのroleとjobの絞り込み機能追加 #7418
管理ページに、ユーザーのroleとjobの絞り込み機能追加 #7418
Conversation
@machida |
@reckyy デザイン入れましたー 一点、お願いがあります。 職業での絞り込みにも「全員」を追加お願いします🙏 |
e6e6858
to
4d3e19b
Compare
@machida |
058ccb9
to
7d9c3ff
Compare
@SuzukaHori |
@reckyy |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
お待たせしました!
動作はバッチリで、絞り込みが正しく動作していることを確認しました👍
数点コメントしましたので、お手隙の際にご確認ください😊
#7418 (comment) や #7418 (comment) など、重箱の隅を突いている部分もあるので、そちらの修正の是非の判断はお任せします🙇♀️
@@ -3,11 +3,17 @@ | |||
class Admin::UsersController < AdminController | |||
before_action :set_user, only: %i[show edit update] | |||
ALLOWED_TARGETS = %w[all student_and_trainee inactive hibernated retired graduate adviser mentor trainee year_end_party campaign].freeze | |||
ALLOWED_JOBS = User.jobs.keys.prepend('all') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
定数かつ配列なので、freeze
しておいた方がいいかもしれないです❄️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おっしゃる通りです。修正しました!
[fix]定数をfreeze
user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee') | ||
if @job.present? && ALLOWED_JOBS.include?(@job) | ||
scoped_job = @job == 'all' ? @job : "job_#{@job}" | ||
user_scope = user_scope.public_send(scoped_job) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ALLOWED_JOBS
で絞り込みはされていますが、ユーザーが直接入力できるparams[:job]
をpublic_sendで直接メソッド名として使うのは、危険性もあるかなと思います。
send
を使用せず書くのが理想的だと思うのですが、難しいならALLOWED_JOBS.include?(@job)
が何かの拍子に消されたりしないよう、users_roleと似たコメントを残すのが良いと思いました!
Lines 403 to 411 in a917aa0
# このメソッドはユーザから送信された値をsendに渡すので、悪意のあるコードが実行される危険性がある | |
# そのため、このメソッドを使用する際には安全性の確保のために以下の引数を指定すること | |
# allowed_targets: 呼び出したいscope名に対応するtargetを過不足なく指定した配列。 | |
# default_target: targetに不正な値が渡された際、users_roleが返すスコープ名に対応するtargetを指定する。デフォルトでは:noneを指定しているため何も返さない。 | |
def users_role(target, allowed_targets: [], default_target: :none) | |
key = (ALL_ALLOWED_TARGETS & allowed_targets).include?(target) ? target : default_target | |
scope_name = TARGET_TO_SCOPE.fetch(key, key) | |
send(scope_name) | |
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
send
以外の方法が思いつかなかったんですよね〜。。
ただ、確かにコードの改竄を防ぐためのコメントの必要性はごもっともです。
なので、追加しました!ありがとうございます 🙇
[chore]コードの意図を説明するコメント追加
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コメントの追加を確認しました👍ありがとうございます!
send
以外の方法を私も考えてみたのですが、↓のように全部に条件分岐を書くぐらいしか思いつきませんでした💦
user_scope = case @job
when 'all'
user_scope
when 'student'
user_scope.job_student
when 'office_worker'
user_scope.job_office_worker
when 'part_time_worker'
user_scope.job_part_time_worker
when 'vacation'
user_scope.job_vacation
when 'unemployed'
user_scope.job_unemployed
end
komagataさんのレビューでsend
を使わず簡潔に書ける方法が見つかれば、私も勉強させていただきます🙇♀️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ALLOWED_JOBS
で絞ってるんだったらsend
してもいいかな~とおもいました。
test/system/admin/users_test.rb
Outdated
test 'show listing hibernated and student' do | ||
visit_with_auth '/admin/users?target=hibernated&job=office_worker', 'komagata' | ||
assert_equal '管理ページ | FBC', title | ||
assert_text 'kyuukai(Kyu Kai)' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
users_controller.rbのjobの絞り込みの処理(13~16行目)をコメントアウトしても、テストが通ってしまうように見えました。
「条件に当てはまらないユーザが表示されていないこと」も合わせてテストするといいと思いました!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おっしゃる通りです。
検索対象のみが表示されていることを確認するテストに修正しました。
[fix]正常にテストできていなかったため、修正
@@ -0,0 +1,24 @@ | |||
.page-main-filter | |||
.container | |||
= form_with url: admin_users_path(target: @target), local: true, method: 'get', class: 'page-main-filter__inner' do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
細かいですが、特に理由がないならadmin_users_path(@target)
の書き方でもいいかもと思いました🙇♀️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
一応理由としては、「クエリパラメータとして追加される」ということを明記するためにこの書き方を採用しています。(必要なさそうですかね、、?😶)
そちらを踏まえて、再度ご意見をお伺いしたいです!👀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
お返事ありがとうございます🙇♀️
明示的にクエリパラメータに追加する方が適切だと思いましたので、このままでお願いします!
user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee') | ||
if @job.present? && ALLOWED_JOBS.include?(@job) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
「仕事の状況で絞り込み」は他のページでも使う可能性があると思うので、可能であればモデルに書いておくと再利用しやすいと思いました!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
こちらに関してですが、「仕事の状況で絞り込み」が他で行われるケースが思いつきませんでした。😭
どのような可能性を想定されたか、教えていただきたいです!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
すみません、前のコメントにちゃんと書いておけばよかったです😅
あまり確固たるイメージはなく、相談部屋(/talks
)にも同じ検索機能を作ったり、通常ユーザのユーザ一覧(/users
)でも「学生」を検索できるようになったりすることを漠然とイメージしていました。
加えて、行数オーバーのコントローラのリファクタリングに苦労しているPRを最近見たので(多分100行以上?だとrubocopで警告が出る)、無理がないならこの段階でコントローラーの行数を削っておいた方がいいのかな?という気持ちでした👀
ただ現状そのような機能の実装予定はなく、考えすぎな気もしたので、元のままでも大丈夫だと思います🙇♀️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
詳細ありがとうございます!
なるほど〜。
相談部屋(/talks)にも同じ検索機能を作ったり、通常ユーザのユーザ一覧(/users)でも「学生」を検索できるようになったりすることを漠然とイメージしていました。
後者は職業が非公開情報であることから優先度は低めに感じますが、前者は確かになるほどですね〜。(管理者視点での相談ページを見たことがなかったので、このご意見はとても参考になります。)
komagataさんに確認してみます!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
そもそもcontrollerがfatなのでほとんどの処理をmodelに持っていきたい感じがします。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@komagata
modelに移行しました。
jobの検索ロジックをcontrollerからmodelに移行
test/system/admin/users_test.rb
Outdated
@@ -44,6 +44,12 @@ class Admin::UsersTest < ApplicationSystemTestCase | |||
assert_text 'kensyu(Kensyu Seiko)' | |||
end | |||
|
|||
test 'show listing hibernated and student' do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
「休会中の生徒」の検索ではなく、「休会中の会社員の生徒」を検索するテストのように見えたので、名前もそれに即したものだと良いかなと思いました👀
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@SuzukaHori |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
修正ありがとうございます!
お返事とコメントしましたので、お手隙の際ご確認をお願いします🙇♀️
#7418 (comment) に意見を書きましたが、このままにされる場合も問題ないと思いますので、私からはAprroveさせていただきます😊
user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee') | ||
if @job.present? && ALLOWED_JOBS.include?(@job) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
すみません、前のコメントにちゃんと書いておけばよかったです😅
あまり確固たるイメージはなく、相談部屋(/talks
)にも同じ検索機能を作ったり、通常ユーザのユーザ一覧(/users
)でも「学生」を検索できるようになったりすることを漠然とイメージしていました。
加えて、行数オーバーのコントローラのリファクタリングに苦労しているPRを最近見たので(多分100行以上?だとrubocopで警告が出る)、無理がないならこの段階でコントローラーの行数を削っておいた方がいいのかな?という気持ちでした👀
ただ現状そのような機能の実装予定はなく、考えすぎな気もしたので、元のままでも大丈夫だと思います🙇♀️
user_scope = User.users_role(@target, allowed_targets: ALLOWED_TARGETS, default_target: 'student_and_trainee') | ||
if @job.present? && ALLOWED_JOBS.include?(@job) | ||
scoped_job = @job == 'all' ? @job : "job_#{@job}" | ||
user_scope = user_scope.public_send(scoped_job) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コメントの追加を確認しました👍ありがとうございます!
send
以外の方法を私も考えてみたのですが、↓のように全部に条件分岐を書くぐらいしか思いつきませんでした💦
user_scope = case @job
when 'all'
user_scope
when 'student'
user_scope.job_student
when 'office_worker'
user_scope.job_office_worker
when 'part_time_worker'
user_scope.job_part_time_worker
when 'vacation'
user_scope.job_vacation
when 'unemployed'
user_scope.job_unemployed
end
komagataさんのレビューでsend
を使わず簡潔に書ける方法が見つかれば、私も勉強させていただきます🙇♀️
@@ -0,0 +1,24 @@ | |||
.page-main-filter | |||
.container | |||
= form_with url: admin_users_path(target: @target), local: true, method: 'get', class: 'page-main-filter__inner' do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
お返事ありがとうございます🙇♀️
明示的にクエリパラメータに追加する方が適切だと思いましたので、このままでお願いします!
@SuzukaHori
承知しました〜。 |
@komagata お尋ねしたいこと下記議論について、ご意見をお伺いしたいです。
|
@reckyy それぞれのスレッドにコメントさせていただきました~ |
49aa56d
to
8c917bc
Compare
@komagata
コミットメッセージのprefixについてですが、こちらprefixがないコミットメッセージを採用した別PRを再作成したほうがよろしいでしょうか。 他のPR2つでも同様の質問を行なっています。もし3つのPRのうち、一つにご回答いただければ他PRでのこの質問内容に関しては、スルーしていただいて大丈夫です。 🙇 |
8c917bc
to
21b35ae
Compare
21b35ae
to
77e8fa0
Compare
@komagata
上記2点が完了しましたので、再度ご確認をお願いいたします。 |
test/helpers/users_helper.rb
Outdated
@@ -8,4 +8,33 @@ class UsersHelperTest < ActionView::TestCase | |||
assert_includes countries['JP'], %w[北海道 01] | |||
assert_includes countries['US'], %w[アラスカ州 AK] | |||
end | |||
|
|||
test 'roles_for_select returns array for select_tag containing role info' do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test 'roles_for_select returns array for select_tag containing role info' do | |
test '#roles_for_select' do |
他に合わせて正常系のみのテストであればこういう命名でいいかなと思いました。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おっしゃる通り、正常系のみのテストなのでメソッド名のみに命名し直しました。
testの命名を変更
@komagata |
@@ -7,7 +7,9 @@ class Admin::UsersController < AdminController | |||
def index | |||
@direction = params[:direction] || 'desc' | |||
@target = params[:target] | |||
@job = params[:job] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@job
はviewで使っていますか?
もし使っていなければインスタンス変数である必要はないかもです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@reckyy なるほどです~
@komagata |
00a5b38
to
d381f3f
Compare
@komagata |
d10cf7b
to
d175997
Compare
ビューではなく、ヘルパーファイルにroleとjobの配列を返すメソッド作成
確かに休会&会社員で検索はできていたが、それ以外のユーザー(つまりjobでの検索が機能していなくても) が引っかかっていても、テストは通っていた。なので、検索対象外のユーザーが確認できないことの確認を追加
d175997
to
d7fe6a0
Compare
@komagata |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
確認させていただきました。OKです~👌
@@ -7,7 +7,9 @@ class Admin::UsersController < AdminController | |||
def index | |||
@direction = params[:direction] || 'desc' | |||
@target = params[:target] | |||
@job = params[:job] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@reckyy なるほどです~
Issue
概要
#7348 (comment) の通りです。
変更確認方法
feature/admin-can-sort-by-user-roles-and-jobs
をローカルに取り込むforeman start -f Procfile.dev
komagata
ormachida
でhttp://localhost:3000/admin/users にアクセス。Screenshot
変更前
変更後