-
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を表す色枠が出ていないバグの修正 #7559
Conversation
レビュー依頼お疲れ様です🙏 急ぎではありませんので、無理ないタイミングで全く問題ありません! |
お疲れ様です🙏 お忙しい中、申し訳ありませんがレビューをお願いすることは可能でしょうか🙆? 急ぎではありませんので、無理ないタイミングで全く問題ありません! 追記お忙しそうなので今回は別の方に依頼したいと思います!またお願いいたします〜 |
2e47005
to
3d5f866
Compare
お疲れ様です🙏 急ぎではありませんので、無理ないタイミングで全く問題ありません!(1~2週間後とかでもOKです) ご検討のほど、よろしくお願いいたします🙇♂️ |
@hirano-vm4 ひとまずコードをざっくり読んで、週末に不明点など質問するかと思います。 |
@hirano-vm4 「コメントユーザーアイコンの重複を削除」 これは、「本Issue以前からアイコンが重複していた」というわけではありませんよね? あとから見返すと分かりづらくなってしまいそうなので、コミットをまとめるとよいかと思います。 |
このコミットから最新のコミットまでをひとまとめにするとよいかと思いますー |
b29b1f2
to
ea4cd4c
Compare
ありがとうございます!おっしゃる通り、このIssueで作業の過程で発生した確認の必要のない修正まで細かくコミットしてしまっていたのでコミットをまとめました🙏 確認しにくい状態になっていて、お手数おかけしました!引き続きよろしくお願いします🙇♂️ |
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.
@hirano-vm4
おはようございます。レビューしました。
1点確認をお願いします!
変更後の影響が大きいようなら、現状のままでも構いません。
json.comments do | ||
json.array! comments.commented_users do |user| | ||
json.array! report.commented_users.uniq do |user| |
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.
comments.commented_users
のままで user.primary_roleを利用できた方がいいかもしれません。
(app/views/api/courses/practices/index.json.jbuilder
のように)
comments.commented_users
だとuser.primary_role
が使えません。おそらくCommentモデルのモデルメソッドを呼び出しています。
report.commented_users
なら使えるのはReportモデルで Commentable moduleをincludeしているためだと思います。Commentモデルにも同様にできないか試してみてください。
ただ、他の箇所で弊害が起こる可能性もあるため、問題がでてしまったら今回のままでやったほうがよさそうです。
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.
お忙しい中、確認いただきありがとうございます🙏
comments.commented_users のままで user.primary_roleを利用できた方がいいかもしれません。(app/views/api/courses/practices/index.json.jbuilder のように)
これは私も同意で当初その方向で進めていましたが、以下の原因から実現できませんでした🧐
またCommentモデルでCommentable moduleをincludeしても状況は変わらずといった状態でした⚡️
原因については下記になります。
primary_roleについて
まず、primary_role
自体はUserDecorator(app/decorators/user_decorator/role.rb)というdecorator内に定義されています。
このdecoratorは、ActiveDecoratorというgemで管理されています。
ActiveDecoratorは、ViewでModelが関わるロジック等を扱いたいとき(表示を整形したいとか)にHelperの代替として用いられるもので、明示的にdecorate
やinclude
しなくても利用できるようになる便利なgemとのことです。
_user_icons.json.jbuilderにreportを渡すとprimary_roleを取得できてcommentsだと取得できない理由
ActiveDecoratorの仕様を確認すると、Controllerで宣言されたインスタンス変数にdecorateメソッドを自動で適用するコードになっていることが確認できました。
自動でデコレーションされる条件
この自動デコレーションは、特定の条件下でのみ行われます。
コントローラーからビューへ渡されるインスタンス変数や、ビュー等でレンダリングされる部分テンプレート(_user_icons.json.jbuilder)に直接渡されるオブジェクトがデコレートの対象となるようです。
report自体を部分テンプレートに渡す場合
この場合はインスタンス変数からオブジェクトを直接渡しているので、部分テンプレート先でreportから辿ってprimary_role
が取得できます。
関連オブジェクトcommentsを部分テンプレートに渡す場合
一方で、関連オブジェクトを渡した場合、そのオブジェクト自体は自動デコレートの条件から外れるため、commentsからprimary_role
が取得できなくなります。
以上が原因のようです!
対策
現状のコードで実現するか、もしくはコード量を減らし、修正点を最小限にする場合は、以下のように_user_icons.json.jbuilder
のuser情報を取得する際に明示的にUserDecoratorを適用させる方法もありました。
app/views/api/comments/_user_icons.json.jbuilder
json.comments do
json.array! comments.commented_users do |user|
user.extend(UserDecorator::Role)
json.user_icon user.avatar_url
json.user_id user.id
json.primary_role user.primary_role
end
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.
了解しました!
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.
https://github.com/fjordllc/bootcamp/pull/7559/files#r1547030503
@hirano-vm4
了解しました。Approveしますー。今後の方針は @komagata さんに確認をお願いします。
ありがとうございました🙏分かりにくい部分を確認いただき、ありがとうございました!引き続きよろしくお願いします! レビュー依頼チームメンバーによるレビューが終わりました!レビューをお願いします🙏 コードで確認したい点現状、バグの修正は終了していますが、 これはActiveDecoratorによるもので、関連モデルを別ファイルに渡すと自動デコレートされないことが原因です。 今回はデコレートされた しかし、明示的に以下のようにdecorateすると以下のファイルの一箇所だけの修正だけで実現できそうです。
json.comments do
json.array! comments.commented_users do |user|
user.extend(UserDecorator::Role)
json.user_icon user.avatar_url
json.user_id user.id
json.primary_role user.primary_role
end
end 上記のアプローチと、現状の変更のどちらがFBCには適しているのか、判断ができなかったのでご意見いただければと思います。 個人的には上記のように明示的にdecorateすると変更するコードの記述量が少ないので良いと考えていますが、他のファイルを見る限り同じような記述はないので統一した方が良いという考えもあるような気がしています。 この点についていかがでしょうか? |
extendが大丈夫なのかちょっと怖い感じがしました。 https://www.satoryu.com/blog/2021/08/01/how-to-use-active_decorator-for-ruby-object.html partial使ったときにdecorateされるのでjbuilder内でpartialを使うのはどうでしょうか? |
ありがとうございます! 参考URLもありがとうざいます! 現在の実装のままでいきたいと思いますがいかがでしょうか?
json.reports @reports do |report|
json.partial! "api/reports/report", report: report
json.partial! "api/reports/checks", checks: report.checks
json.partial! "api/comments/user_icons", report: report # コントローラーのインスタンス変数の時点でデコレートされた@reportの要素自身を渡す
json.user do
json.partial! "api/users/user", user: report.user
end
end このようにすると コントローラー(ActionController)で(暗黙的なものも含めて)呼ばれるrender
json.reports @reports do |report|
json.partial! "api/reports/report", report: report
json.partial! "api/reports/checks", checks: report.checks
json.partial! "api/comments/user_icons", comments: report.comments # reportから関連オブジェクト`comments`を渡す
json.user do
json.partial! "api/users/user", user: report.user
end
end 上記のように、
json.partial! "api/comments/user_icons", comments: report.comments, commented_users: report.commented_users.uniq このように渡す時点でuserオブジェクトを指定すれば上記のようにUserDecoratoeを自動で適用してくれるので、問題なく これであれば、シンプルにインスタンス変数の時点でデコレートされたものを渡す現在の実装でも良いかな?と個人的には感じましたがいかがでしょうか? |
ea4cd4c
to
0c657ed
Compare
0c657ed
to
e4f0627
Compare
@hirano-vm4 良いと思います~! |
ありがとうございます!現在のコードで大丈夫そうであればマージしていただき、ステージング環境にデプロイされたことを確認次第、動作確認に入ります🙆 |
@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です~👌
Issue
概要
日報一覧ページ
/reports
のミニアイコンなど、一部のユーザアイコンでroleを表す色枠が表示されていないバグを修正するIsuseです。下記の該当ページroleが表示されているかの確認をお願いします!
変更確認方法
bug/fix-missing-role-border-on-icons
をローカルに取り込む※一般ユーザーは枠線はありません
※同じユーザーが複数回コメントをしてもアイコンの表示は1回のみ
Screenshot
変更前
/reports
のミニアイコンproducts
のミニアイコン/external_entries
の普通のアイコン変更後
/reports
のミニアイコンproducts
のミニアイコン/external_entries
の普通のアイコン