Skip to content
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

プラクティス完了ツイート機能の実装 #3385

Merged
merged 30 commits into from
Feb 10, 2022

Conversation

konaga-k
Copy link
Contributor

@konaga-k konaga-k commented Oct 12, 2021

refs #2045

概要

  • 受講生がプラクティスを完了したとき、プラクティス完了ツイートを可能にする
  • プラクティス完了ツイートはモーダルから行えるようにして、以下のタイミングでモーダルを表示する
    • 受講生がプラクティス詳細ページで完了ボタンを押したとき
    • メンターが提出物をチェックした後、受講生が提出物詳細ページにアクセスしたとき(初回アクセス時のみ)
    • 受講生が完了済みのプラクティス詳細ページ・提出物詳細ページの「完了Tweetする」ボタンを押したとき
  • プラクティス完了ツイートには、プラクティスごとに存在するプラクティス完了ページへのリンクURLを記載し、ツイートにはプラクティスのOGP画像が表示されるようにする
    • プラクティス完了ページにはログインしていなくても(=フィヨルドブートキャンプ関係者でなくても)アクセスできる
    • ※ローカル環境からのツイートではOGP画像を確認できないはずなので、staging環境で確認します
  • 管理者・メンターはプラクティス編集ページからOGP画像を登録可能とする

モーダルの自動表示制御

プラクティス完了後、提出物詳細ページに初回アクセスしたときのみモーダルを自動表示するため、
learningsテーブルにモーダル表示済みフラグを追加する

UI

「完了Tweetする」ボタン

画像

プラクティス詳細ページ
aptの基礎を覚える___FJORD_BOOT_CAMP(フィヨルドブートキャンプ)

提出物詳細ページ

画像 aptの基礎を覚えるの提出物___FJORD_BOOT_CAMP(フィヨルドブートキャンプ)

プラクティス完了ツイート用モーダル

画像 aptの基礎を覚える___FJORD_BOOT_CAMP(フィヨルドブートキャンプ)

プラクティス完了ツイート

画像

2021-10-12_23-50

プラクティス編集ページ

画像 プラクティス作成___FJORD_BOOT_CAMP(フィヨルドブートキャンプ)

プラクティス完了ページ

画像 aptの基礎を覚える___FJORD_BOOT_CAMP(フィヨルドブートキャンプ)

@konaga-k konaga-k self-assigned this Oct 12, 2021
@konaga-k konaga-k force-pushed the feature/tweet-learning_completion branch 3 times, most recently from c7492f5 to 9645997 Compare October 12, 2021 15:21
@konaga-k
Copy link
Contributor Author

konaga-k commented Oct 12, 2021

@machida
開発が遅くなりすみません🙇
以下ページ・要素のデザイン設定お願いします

「完了Tweetする」ボタン

プラクティス詳細ページ: /practices/:id https://github.com/fjordllc/bootcamp/blob/feature/tweet-learning_completion/app/views/practices/show.html.slim#L129-L136
提出物詳細ページ: /products/:id https://github.com/fjordllc/bootcamp/blob/feature/tweet-learning_completion/app/views/products/show.html.slim#L120-L125

現実装イメージ

image
image

プラクティス完了ツイート用モーダル

https://github.com/fjordllc/bootcamp/blob/feature/tweet-learning_completion/app/views/shared/_modal_learning_completion.html.slim

現実装イメージ

image

プラクティス編集ページ

/practices/:id/edit https://github.com/fjordllc/bootcamp/blob/feature/tweet-learning_completion/app/views/practices/_form.html.slim#L76-L80

現実装イメージ

image

プラクティス完了ページ

/practices/:practice_id/completion https://github.com/fjordllc/bootcamp/blob/feature/tweet-learning_completion/app/views/practices/completion/show.html.slim

現実装イメージ

image


また、テスト用のOGP画像として拾ってきたフリー画像を使っているのですが、余力があれば実際に使いそうなものに差し替えてもらえると助かります
https://github.com/fjordllc/bootcamp/blob/feature/tweet-learning_completion/test/fixtures/files/practices/ogp_images/1.jpg

@konaga-k konaga-k force-pushed the feature/tweet-learning_completion branch from 9645997 to 8189301 Compare October 12, 2021 15:36
@konaga-k
Copy link
Contributor Author

テストが落ちているのはデザイン適用後に直そうと思います

@konaga-k konaga-k marked this pull request as draft October 13, 2021 12:57
@konaga-k
Copy link
Contributor Author

konaga-k commented Oct 20, 2021

先にレビュー依頼して、デザインは最後にやってもらうことになりました
テストが落ちているのとOGP画像のパスが正しくないので、そこを修正したらレビュー依頼を出します

@konaga-k konaga-k force-pushed the feature/tweet-learning_completion branch from 8189301 to 2901dfa Compare October 20, 2021 14:16
@konaga-k konaga-k marked this pull request as ready for review October 20, 2021 14:58
Copy link
Contributor Author

@konaga-k konaga-k left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@haruguchi-yuma
レビューお願いします🙏

Comment on lines +13 to +15
label#js-complete.a-button.is-md.is-warning.is-block(
@click='pushComplete',
for='modal-learning_completion'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image
プラクティス詳細ページの完了ボタンですが、button要素からlabel要素に変更し、for属性を追加しました
理由としては、完了ボタンを押したときにモーダル表示されるようにするためです
label要素がクリックされると for属性の値 modal-learning_completion をidとする要素がcheckedになります
モーダルがcheckedになると、sassの設定により画面上に表示されます

input:checked + &
display: block

@@ -1,6 +1,8 @@
- title @practice.title
- category = @practice.category(current_user.course)

= render '/shared/modal_learning_completion', practice: @practice, tweet_url: @tweet_url, should_display_message_automatically: false
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

メンターがプラクティスを完了させた後に受講生がプラクティス詳細ページに初回アクセスしたとき、モーダルを自動表示するかはどっちでもいい気がしていますが、とりあえずは自動表示しないように設定しています
プラクティス完了通知を受け取った受講生は、プラクティス詳細ページより先に、通知のリンク先である提出物詳細ページに行くと思うので、結局そっちでモーダルが表示されるだろうという想定です
image

@@ -0,0 +1,10 @@
- title @practice.title
- if @practice.ogp_image.attached?
- set_meta_tags(og: { image: polymorphic_url(@practice.ogp_image), url: request.url })
Copy link
Contributor Author

@konaga-k konaga-k Oct 20, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OGP画像のパスはホスト名を含む絶対パスでないといけないようなので、そのように設定しました

polymorphic_url(@practice.ogp_image) で画像の絶対パスが取れるのは以下のブログ記事で見つけた話で、正直根拠がよく分かりません(公式のドキュメントを見てもそういう記載が見つからない)
参考: https://qiita.com/shou8/items/3c41cb6a06ff1e0cdb95#urlが欲しい
記事内で polymorphic_url と並んで載っている url_for(@practice.ogp_image) だと相対パスになってしまい、この理由も分かりません
とりあえず上手く動いているので polymorphic_url を採用してます

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://api.rubyonrails.org/classes/ActionView/RoutingUrlFor.html#method-i-url_for
調べてみたんですが、公式APIにはhostを指定しない場合はデフォルトでonly_path: trueになるみたいでurl_forを使うなら、オプションを使う必要がありそうです。

Copy link
Contributor Author

@konaga-k konaga-k Oct 25, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@haruguchi-yuma
ありがとうございます
なるほど、そういう理由で相対パスになるんですね

確かにhostオプションの指定や only_path: false で上手く動けばいいんですが、文法的にアウトになっちゃうんですよね(引数は0〜1個しか取れない)

wrong number of arguments (given 2, expected 0..1)
image

ちょっと url_for を使うのは難しそうなので、 polymorphic_url のままにしてみます

Comment on lines +3 to +7
module LearningDecorator
def should_display_message_automatically?(current_user:)
user == current_user && complete? && !completion_message_displayed?
end
end
Copy link
Contributor Author

@konaga-k konaga-k Oct 22, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

モーダルの初回表示判定はviewでしか使わないのでメソッドはdecoratorにしましたが、
今見ると権限系に近い処理なので、モデルに直接生やした方がよかったのか迷ってます

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

うーん、正直どこにメソッド定義をしたらいいか自分には判断できませんね😥
これはぜひ駒形さんに聞きたいです!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現在viewでしか使わず、今後も他で使われなさそうであればこれで良いと思います〜

Copy link
Contributor

@haruguchi-yuma haruguchi-yuma left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

遅くなってすみません!
twitter周りや、modalの作り方等自分が知らないことばかりでとても勉強になりました。😄
自分がみておかしいと思うところは特になかったのですが1、2点コメントしていますので確認お願いします。

def tweet_url(practice_title:)
completion_text = "フィヨルドブートキャンプのプラクティス「#{practice_title}」が完了しました🎉🎉🎉"
# ref: https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/web-intent
tweet_param = URI.encode_www_form(text: completion_text, url: request.url, hashtags: 'fjordbootcamp')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

プラクティス完了ツイートには、プラクティスごとに存在するプラクティス完了ページへのリンクURLを記載し、ツイートにはプラクティスのOGP画像が表示されるようにする

ツイートに記載されてるurlはプラクティス完了ページへ遷移するurlだと思うのですが、このままだとプラクティス詳細ページに飛んでしまうので、request.url + '/completionとした方が良さそうです。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは気づきませんでした、指摘ありがとうございます🙏
修正前は

  • プラクティス詳細ページからツイートしたときはプラクティス詳細ページに飛ぶ
  • 提出物詳細ページからツイートしたときは提出物詳細ページに飛ぶ

となっていて、URLに completion を足すだけだと対処できなさそうなので、
practice_completion_url でURLを返すようにしました
ついでに tweet_url 内で practice.titlepractice.id を使うようになったので、引数は practice に変更しました
0fa7391

Comment on lines +3 to +7
module LearningDecorator
def should_display_message_automatically?(current_user:)
user == current_user && complete? && !completion_message_displayed?
end
end
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

うーん、正直どこにメソッド定義をしたらいいか自分には判断できませんね😥
これはぜひ駒形さんに聞きたいです!

Copy link
Contributor Author

@konaga-k konaga-k left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@haruguchi-yuma
修正したので再度確認お願いします🙏

def tweet_url(practice_title:)
completion_text = "フィヨルドブートキャンプのプラクティス「#{practice_title}」が完了しました🎉🎉🎉"
# ref: https://developer.twitter.com/en/docs/twitter-for-websites/tweet-button/guides/web-intent
tweet_param = URI.encode_www_form(text: completion_text, url: request.url, hashtags: 'fjordbootcamp')
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは気づきませんでした、指摘ありがとうございます🙏
修正前は

  • プラクティス詳細ページからツイートしたときはプラクティス詳細ページに飛ぶ
  • 提出物詳細ページからツイートしたときは提出物詳細ページに飛ぶ

となっていて、URLに completion を足すだけだと対処できなさそうなので、
practice_completion_url でURLを返すようにしました
ついでに tweet_url 内で practice.titlepractice.id を使うようになったので、引数は practice に変更しました
0fa7391

@machida machida self-assigned this Oct 25, 2021
Copy link
Contributor

@haruguchi-yuma haruguchi-yuma left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認しました。これで大丈夫だと思いますー!😃

@konaga-k konaga-k requested a review from komagata October 25, 2021 11:23
@konaga-k
Copy link
Contributor Author

konaga-k commented Oct 25, 2021

@komagata
レビューお願いします🙏
まだデザインを当ててもらっていないので、マージはしないでおいてほしいです

@machida
Copy link
Member

machida commented Oct 27, 2021

こちらのIssue、machidaが引きつぎますー


private

def tweet_url(practice:)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これも Practice#tweet_url で呼べるようにしたほうがいいですかね…?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

基本的に動詞より名詞の方が副作用がない(ように見える)のでプログラムがシンプルになります。

引数なしでいければ、Practice#tweet_urlはクラスのプロパティのように見えるのでそちらの方がわかりやすかな〜と思いました。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

すみません、こちら僕がよく理解できていないかもしれません🙇‍♂️
def tweet_url(practice:)def practice_tweet_urlに変更しました。
def Practice#tweet_url だとrubocopに引っかかるため、上記のメソッド名にしました。
僕の認識がズレていたらご指摘ください🙇‍♂️

@konaga-k
Copy link
Contributor Author

konaga-k commented Nov 1, 2021

@komagata
コンフリクトが発生していますが、まだデザイン適用前でどのみちマージはできないので、
レビューだけお願いしてもよいでしょうか?
コンフリクト解消については、レビューが終わってから(もしくはレビュー指摘が発生してから)machidaさんと調整します

@komagata
Copy link
Member

komagata commented Nov 1, 2021

@konaga-k

コンフリクトが発生していますが、まだデザイン適用前でどのみちマージはできないので、

これはなぜでしょう?

@konaga-k
Copy link
Contributor Author

konaga-k commented Nov 2, 2021

@komagata
このPRではデザインを当てる箇所が多く時間がかかるため、
先にレビューから進めるようにとmachidaさんから言われています
そのため、レビューが完了してもデザイン適用待ちになると思います

ここまで書いて思ったんですが、このPRのAssigneeはデザインを担当するmachidaさんが引き継いでます
レビュー指摘によって修正が必要であれば、machidaさんから自分に修正依頼が飛ぶことになっていた気がします
自分がレビューの進め方について直接komagataさんに提案するのは権限超えてますね🙇

@machida
デザインもPRレビューも膠着していて、コンフリクトが発生している状態なんですが、以下のような進め方をしてもらう方針でよいでしょうか?(もっとやりやすい方法があればそちらで決めてもらえれば)

@komagata
コンフリクトが発生していますが、まだデザイン適用前でどのみちマージはできないので、
レビューだけお願いしてもよいでしょうか?
コンフリクト解消については、レビューが終わってから(もしくはレビュー指摘が発生してから)machidaさんと調整します

@komagata
Copy link
Member

komagata commented Nov 2, 2021

@konaga-k コンフリクトしているのはjsとymlなのでデザイン関係ないので解消できるのではと思うのですがいかがでしょう?

@komagata
Copy link
Member

komagata commented Nov 2, 2021

📝 @komagata のレビュー待ち。

@R-Tsukada R-Tsukada force-pushed the feature/tweet-learning_completion branch from c3ce55e to 122c058 Compare February 1, 2022 07:21
@R-Tsukada
Copy link
Contributor

@komagata
コンフリクト修正しました🙇‍♂️

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認しました、OKですー🙆‍♂️

@komagata
Copy link
Member

komagata commented Feb 1, 2022

@machida コードの方はレビューOKです〜!

@R-Tsukada
Copy link
Contributor

ありがとうございます🙇‍♂️

@machida
Copy link
Member

machida commented Feb 9, 2022

@komagata ありがとうございます!!では、こちら画像の準備ができるまでコメントアウトしてマージしたいと思います。

@komagata
Copy link
Member

@machida 了解です〜
準備ができたらマージしちゃってください〜

@machida
Copy link
Member

machida commented Feb 10, 2022

@komagata コメントアウトしてテストが通ったのでマージしてしまいますー

@machida machida merged commit 83d7d80 into main Feb 10, 2022
@machida machida deleted the feature/tweet-learning_completion branch February 10, 2022 06:18
@github-actions github-actions bot mentioned this pull request Feb 10, 2022
54 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants