bootcamp icon indicating copy to clipboard operation
bootcamp copied to clipboard

メンター公開プロフィールの公開・非公開切り替え機能

Open hirano-vm4 opened this issue 11 months ago • 23 comments

Issue

  • #7500

概要

メンターの公開用プロフィールを非表示に設定することができるようになる新機能の実装です。メンターのcurrent_user/edit内のチェックボックスで公開・非公開を切り替えます。

非表示をON(true)にしている場合でもログイン状態では表示されます。

変更確認方法

  1. feature/mentor-profile-display-toggleをローカルに取り込む
  2. rails db:migrateを実行
  3. メンター権限のあるユーザーでログイン
  4. http://localhost:3000/current_user/edit (登録情報更新)にアクセス
  5. プロフィール非公開をONにして更新
  6. http://localhost:3000/welcome にアクセスし、ログイン状態では表示されていることを確認
  7. ログアウトする
  8. ログアウトすると ホーム ( http://localhost:3000 ) にリダイレクトされるので、そのまま非表示にしたメンターが表示されていないことを確認
  9. 再び http://localhost:3000/welcome にアクセスし、こちらでも表示されていないことを確認
  10. http://localhost:3000/current_user/edit (登録情報更新)にアクセス
  11. プロフィール非公開をOFFにして更新
  12. http://localhost:3000/welcome にアクセスし、表示が戻っていることを確認

※ http://localhost:3000 はログイン状態だとダッシュボードが表示されるので確認は必要ありません

※ メンター権限あるユーザーはデフォルトではプロフィールは「表示」となりますが、view側のif文でprofile_nameだけは入力していないと表示されないように設定されています

※ メンターのprofile_imageがない場合はデフォルトで白黒ピヨルドの表示

以下のバリデーションについては、町田さんからの依頼で、このIssueでの実装は中止となっています。

Screenshot

変更前

http://localhost:3000/current_user/edit スクリーンショット 2024-03-11 23 02 34

スクリーンショット 2024-03-11 23 06 20

変更後

http://localhost:3000/current_user/edit スクリーンショット 2024-03-11 23 03 14

非表示をON(true)にした場合(未ログイン状態) スクリーンショット 2024-03-11 23 05 34

profile_imageが登録してない場合はデフォルトの画像が表示される スクリーンショット 2024-03-28 14 15 12

【追記】バリデーションの確認

~~http://localhost:3000/current_user/edit (登録情報更新)のメンター紹介用公開プロフィールの中の「プロフィール画像」「プロフィール名」「職業」「プロフィール文」が必須入力となるバリデーションを追加することになりました。~~

~~上記4点を空のまま「更新する」ボタンを押して保存できず、弾かれることについても確認をお願いいたします。~~

【追記】バリデーション(このIssueでの実装はなくなりました)

~~http://localhost:3000/current_user/edit (登録情報更新)のメンター紹介用公開プロフィールの中の「プロフィール画像」「プロフィール名」「職業」「プロフィール文」が必須入力となるバリデーションを追加~~

スクリーンショット 2024-03-15 9 39 54

hirano-vm4 avatar Mar 11 '24 13:03 hirano-vm4

@machida

お疲れ様です!こちらのIssueの実装が完了したので、デザインをお願いします🙏

デザインの対象

今回は、メンターの公開用プロフィールをトップページに非表示にできるようにする新機能の実装です。メンターのcurrent_user/edit内のチェックボックスで公開・非公開を切り替えます。

  • labelのタイトル
  • チェックボックス
  • チェックボックス下の説明文

上記3点がデザインの対象になります!

現在の状態

対象ファイル:app/views/users/form/_hide_mentor_profile.html.slim

.form-item
  = f.label :hide_mentor_profile, class: 'a-form-label'
  label.a-on-off-checkbox.is-md
    = f.check_box :hide_mentor_profile
    span
  .a-form-help
    p
      | あなたのメンター紹介用公開プロフィールをトップページに表示させるか否かの設定です。メンター紹介用公開プロフィールは誰でも閲覧できる場所に表示されます。
      br
      | メンバー以外に表示したくない場合はオンにしてください。

実装の段階でデザインが全くない状態だと見ずらいので仮のデザインを当てています。現在設定しているのは、同じcurrent_user/edit(登録情報変更)の中にある「メール通知」のチェックボックスがイメージと近かったのでそれを設定しています。

スクリーンショット 2024-03-12 13 25 41

参考先:app/views/users/form/_mail_notification.html.slim

動作の確認上で設定しているだけなので特に意図はありませんので、確認していただければと思います🙏

このように相談する際は、「CSSは設定しない」等ありましたらご指導いただけたらと思います!お忙しいかと思いますが、よろしくお願いします!

hirano-vm4 avatar Mar 12 '24 04:03 hirano-vm4

@komagata @machida

先ほどは開発ミーティングありがとうございました!

プロフィールの公開・非公開の切り替え機能に加えて、

「公開プロフィール欄の特定の値が埋まっていない場合」は保存できないようにバリデーションをモデルにかけて、埋めるようユーザーに促す機能を追加するというお話があったと思います🙏

終わった後にslimのコードを確認したところ、メンターさんを表示する条件は以下のようになっています。

app/views/welcome/_mentors.html.slim

section.welcome-child-section
  h3.welcome-child-section__title
    | メンター ・ 顧問
  .welcome-members
    .row.is-gutter-width-32
      - mentors.each do |mentor|
        - if mentor.profile_image.present? && mentor.profile_name.present? && mentor.profile_job.present? && mentor.profile_text.present? && mentor.login_name != 'achamixx'
          .col-xs-12.col-md-6.col-lg-4
            = render 'welcome/mentor', mentor:, page: 'welcome-index'

mentor.profile_image.present? mentor.profile_name.present? mentor.profile_job.present? mentor.profile_text.present? mentor.login_name != 'achamixx'

上記5つを必須の入力になるようにバリデーションをかけるということだと考えていますが(ログインユーザーには表示するため公開・非公開にかかわらず必須)、最後の表示条件であるmentor.login_name != 'achamixx'だけ確認させてください!

この文字列が何を示すか分からず、検索してみたら「あちゃさん」のアカウント名かな?と推測しましたが合っていますでしょうか?

その認識であっているようであれば、以下4点をバリデーションを設定。

mentor.profile_image.present? mentor.profile_name.present? mentor.profile_job.present? mentor.profile_text.present?

mentor.login_name != 'achamixx'に関してはそのままslimの条件に残し、以下のように設定する、という方向で大丈夫そうでしょうか?🙏

app/views/welcome/_mentors.html.slim

section.welcome-child-section
  h3.welcome-child-section__title
    | メンター ・ 顧問
  .welcome-members
    .row.is-gutter-width-32
      - mentors.each do |mentor|
        - if mentor.login_name != 'achamixx'
          .col-xs-12.col-md-6.col-lg-4
            = render 'welcome/mentor', mentor:, page: 'welcome-index'

それか特定のユーザーを選別する場合にも、例えば以下のようにprivateメソッドで選別してバリデーションをかけて、ビュー側のif文を全くなくす方向かを迷っております🙏

class Example < ApplicationRecord
  # プロフィール情報が必須であることを標準のバリデーションで設定
  validates :profile_image, presence: true
  validates :profile_name, presence: true
  validates :profile_job, presence: true
  validates :profile_text, presence: true

  # カスタムバリデーションメソッドを指定
  validate :login_name_cannot_be_achamixx

  private

  # 特定のlogin_nameを持つユーザーを無効にするカスタムバリデーション
  def login_name_cannot_be_achamixx
    if login_name == 'achamixx'
      errors.add(:login_name, "can't be achamixx")
    end
  end
end

hirano-vm4 avatar Mar 13 '24 14:03 hirano-vm4

@hirano-vm4 気付いてくれてありがとうございます!あちゃさんはメンターではないけど、ブログ記事を公開させる必要があったのでメンター権限を付与する必要があり、メンターのロールを持っているが非表示にしていました。

今回の機能で公開をオフにすればよくなるので、あちゃさんの分岐は削除し、バリデーションにも含めない、でお願いします🙏

machida avatar Mar 13 '24 14:03 machida

@machida

遅くなのに、早速の回答ありがとうございます🙏

気付いてくれてありがとうございます!あちゃさんはメンターではないけど、ブログ記事を公開させる必要があったのでメンター権限を付与する必要があり、メンターのロールを持っているが非表示にしていました。

なるほど!あちゃさんは特殊なポジションで活躍されていた事情があったのですね👀

今回の機能で公開をオフにすればよくなるので、あちゃさんの分岐は削除し、バリデーションにも含めない、でお願いします🙏

承知しました!

それでは実装が本番環境にマージされる際には、非公開をfalse(=公開する)がデフォルトで設定されるようになるので、あちゃさん含め、メンターさん各位には周知もしたほうがよいかもしれませんね🧐

プライベートなことに絡む部分だと思いますので(会社や特定の人にバレたくないなど)、私が動ける範囲で周知などありましたら、教えていただければお知らせ等したいとおもいますので、何かあればおっしゃってください!

hirano-vm4 avatar Mar 13 '24 14:03 hirano-vm4

@machida @komagata

追記

先程の町田さんの回答で

今回の機能で公開をオフにすればよくなるので、あちゃさんの分岐は削除し、バリデーションにも含めない、でお願いします🙏

「あちゃさんの分岐は削除」とありましたのでほかは残すという理解をしました!失礼しました🙇‍♂️

以下は念の為残しますので、認識ズレていたらご助言ください🙏

元々の質問

何度も申し訳ありません!

先ほどバリデーションを追加して「view側のif文でメンターさんを表示するかどうか条件指定している部分を簡素化する」と私が話してしまいましたが、

ちなみに現在、他に非表示を希望しているメンターさんはいますでしょうか?(ここに書けない場合は、他でご連絡いただければと思います)

https://bootcamp.fjord.jp/welcome を見る限りは問題なさそうに見えますが念の為確認させてください🙏

理由としては、この機能は公開がデフォルトになるので、slim側のif文の分岐をなくしてしまうと、これから必須になる項目が現在完全に入力されていない場合でも、トップページに表示されてしまうかもしれません🧐(おそらく次に編集を保存するまでは現在のまま設定でいけてしまう)

mentor.login_name != 'achamixx'の条件に関してはユーザー設定から非公開を選択することができるため、slimのif文の分岐から削除できると思いますが、他は残した方がよさそうでしょうか?(それでも一部が埋まっていれば非公開を設定するまで表示される可能性があります)

あえて表示したくなくて完全に項目を埋めていないが、非公開を設定するまで表示されてしまうケースは0ではないと思っての確認になります(おそらくそのような人はいないと思われますが)、念のためプライベートな部分に関わるので確認させてください🙏

この辺を考えてたバリデーションは設定するが、slim側のif文も残しておくのも選択肢としてベターかなと考えております!(そもそもslim側のif文を簡素化するは私がイメージしていた部分なので、お話と私の捉えがずれていたらすいません)

app/views/welcome/_mentors.html.slim

section.welcome-child-section
  h3.welcome-child-section__title
    | メンター ・ 顧問
  .welcome-members
    .row.is-gutter-width-32
      - mentors.each do |mentor|
        - if mentor.profile_image.present? && mentor.profile_name.present? && mentor.profile_job.present? && mentor.profile_text.present?
          .col-xs-12.col-md-6.col-lg-4
            = render 'welcome/mentor', mentor:, page: 'welcome-index'

hirano-vm4 avatar Mar 13 '24 14:03 hirano-vm4

@hirano-vm4

確認ありがとうございます! 現状はトップページの表示は僕の方で管理者権限で各メンターの登録情報をいじって手動で行っているので、

あえて表示したくなくて完全に項目を埋めていない

のケースがあるのですが、それは僕の方でやっていて、誰がそのケースなのかは把握しているので view の if の分岐は削除してしまって大丈夫です🙆‍♂️ リリース直後は表示したくないものが表示されたりなどあるかもですが、すぐに修正します💪

machida avatar Mar 15 '24 08:03 machida

@hirano-vm4 あと、すいません、ついでに見ていただきたいのですが、表示順を created_at 順にしたいと思います。もし、そのようになってなかったら修正をしておいていただきたいです🙏

machida avatar Mar 15 '24 08:03 machida

@machida

お忙しいところ返信ありがとうございます🙏

誰がそのケースなのかは把握しているので view の if の分岐は削除してしまって大丈夫です🙆‍♂️リリース直後は表示したくないものが表示されたりなどあるかもですが、すぐに修正します💪

承知しました!では、slim側のif文はすべて削除しておきます🙆

表示順を created_at 順にしたいと思います。もし、そのようになってなかったら修正をしておいていただきたいです🙏

こちらについては、ログイン状態・非ログイン状態どちらもcreated_atの昇順(古いものから新しいものへ)に並べ替えは完了しています😄

app/models/user.rb

  scope :mentors_sorted_by_created_at, lambda {
    with_attached_profile_image
      .mentor
      .includes(authored_books: { cover_attachment: :blob })
      .order(:created_at)
  }

  scope :visible_sorted_mentors, lambda {
    with_attached_profile_image
      .mentor
      .includes(authored_books: { cover_attachment: :blob })
      .order(:created_at)
      .where(hide_mentor_profile: false)
  }

app/controllers/admin/users_controller.rb

class WelcomeController < ApplicationController
  skip_before_action :require_active_user_login, raise: false
  layout 'welcome'
  DEFAULT_COURSE = 'Railsプログラマー'

  def index
    @mentors = current_user ? User.mentors_sorted_by_created_at : User.visible_sorted_mentors
  end

# 省略

app/controllers/home_controller.rb

class HomeController < ApplicationController
  skip_before_action :require_active_user_login, raise: false

  def index
    if current_user
      display_dashboard
      display_events_on_dashboard
      display_welcome_message_for_adviser
      set_required_fields
      render aciton: :index
    else
      @mentors = User.visible_sorted_mentors
      render template: 'welcome/index', layout: 'welcome'
    end

# 省略

hirano-vm4 avatar Mar 15 '24 13:03 hirano-vm4

@kurumadaisuke

レビュー依頼

お疲れ様です🙏 お忙しい中、申し訳ありません!レビューをお願いすることは可能でしょうか🙆?

急ぎではありませんので、無理のないタイミングで大丈夫です!

ご検討のほど、よろしくお願いいたします🙇‍♂️

hirano-vm4 avatar Mar 17 '24 05:03 hirano-vm4

@hirano-vm4 返信遅くてすいません🙇‍♂️ ちょっと仕事がバタバタしておりまとまった時間が取れずでレビューが厳しそうです🙇‍♂️

kurumadaisuke avatar Mar 18 '24 17:03 kurumadaisuke

@kurumadaisuke 承知しました!またの機会にお願いします🙏

hirano-vm4 avatar Mar 19 '24 00:03 hirano-vm4

@SuzukaHori

レビュー依頼

お疲れ様です! お忙しい中、申し訳ありません!レビューをお願いすることは可能でしょうか🙆?

プラクティス終盤にお願いするのは申し訳ないと感じつつも、他のプラクティス含めてレビューできる方がなかなか見つからずの依頼になります🙏

急ぎではありませんので、無理のないタイミングで大丈夫です!

ご検討のほど、よろしくお願いいたします🙇‍♂️

hirano-vm4 avatar Mar 19 '24 00:03 hirano-vm4

@hirano-vm4 レビュー承知しました👍 数日作業時間があまりとれないので、お時間いただくかもしれません💦 少々お待ちください🙇‍♀️

SuzukaHori avatar Mar 20 '24 02:03 SuzukaHori

@SuzukaHori

ありがとうございました!非常に助かります🙏4連敗中だったのでお願いしてしまいました🙇‍♂️

急がないので来週以降とか学習に支障のないタイミングでよろしくお願いします🎉

追記

1点だけリファクタリングさせてもらっています(6142c7c)🙏

CIがFLAKYなテストが通りにくくなっており、対処中です🙇‍♂️

hirano-vm4 avatar Mar 20 '24 03:03 hirano-vm4

@SuzukaHori

お疲れ様です!無事例のFlakyなテスト改善したので、こちらもCI通りました🙏来週以降で問題ないので引き続きこちらのレビューお願いいたします〜🙆

hirano-vm4 avatar Mar 22 '24 07:03 hirano-vm4

@SuzukaHori お忙しいところ、レビュー対応いただきありがとうございます🙏 アドバイスいただいた点について修正&コメントを返していますので、無理ないタイミングで確認お願いします😊

hirano-vm4 avatar Mar 24 '24 07:03 hirano-vm4

@SuzukaHori

承知しました!ありがとうございました💪助かりました〜引き続きよろしくお願いいたします😊

@komagata

こちら、チームメンバーによるレビューが終了しました!レビューをお願いいたします🙏

hirano-vm4 avatar Mar 24 '24 08:03 hirano-vm4

:memo: リリース時にやること。 リリース前に一時的に赤塚さんと芳賀さんをメンターから外し、リリース後に公開プロフィールを埋めて非表示にする。 machidaが行う。

machida avatar Mar 25 '24 18:03 machida

@hirano-vm4 少しだけ文言と見た目を調整しましたー

machida avatar Mar 25 '24 18:03 machida

@machida

~~本日の開発MTGで依頼のあったバリデーション件、コードを確認したところいつでもバリデーションがかかる状況になっていました😅~~

~~変更をかけますので、町田さんの意図が合っているか今一度大事なことなので擦り合わせさせてください🙏~~

~~バリデーションの条件について~~

~~:profile_image(プロフィール画像) :profile_name(プロフィール名) :profile_job(職業) :profile_text(自己紹介文)~~

~~こちら4点について、現状は 「メンターであれば常に入力必須」 となっていますが、「プロフィールを非公開のときは空欄でもOK」 という変更で大丈夫でしょうか?~~

追記

上記の点について、Discordにて町田さんから方向性の修正がありました。以下の対応となりました。

変更点

  • バリデーションの部分は削除
  • 未入力があっても、プロフィールを公開する設定になっていたら、入力されているものだけを表示(ただし、view側のif文で名前だけは最低限入力している場合のみ表示)
  • アイコンがない場合は画像非表示ではなく、アイコンがない場合に表示する白黒のピヨルド画像を代わりに表示する

理由

  • バリデーションの条件を変更し「プロフィールを非公開にするときは空欄でもOKにする」にするという仕様だと、プロフィールが非表示で未入力にしたとしても、ブログ記事の著者表示を行う際に、未入力があると困る部分が結局でてしまう

  • 今回はバリデーションをなくすことで、デプロイ時のバタバタを避け、仕様の変更をシンプルに保つ

  • 今後、ブログ記事を書いた場合の著者表示の有無を選択できるチェックボックスの導入を検討しているが、今回のIssueではその実装を含めず、別のIssueで対応する

hirano-vm4 avatar Mar 27 '24 14:03 hirano-vm4

@komagata

こちら、駒形さんにレビュー依頼をしている途中でしたが、昨日の開発ミーティングでバリデーションの実装について町田さんから相談があり仕様の変更がありました。

変更点については、対応終了しているのでレビューを引き続きお願いいたします🙏

hirano-vm4 avatar Mar 28 '24 05:03 hirano-vm4

@hirano-vm4 conflictの修正をお願い致します~。

komagata avatar Apr 07 '24 21:04 komagata

@komagata

こちらconflictを解消しました!よろしくお願いします🙏

hirano-vm4 avatar Apr 08 '24 04:04 hirano-vm4

@hirano-vm4 conflictの修正をお願い致します~。

komagata avatar Apr 16 '24 08:04 komagata

@hirano-vm4 conflictの修正をお願い致します~。

@komagata

こちらconflictを解消しました!よろしくお願いします🙏

hirano-vm4 avatar Apr 17 '24 00:04 hirano-vm4