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

プラクティスのOGP画像を1200px × 630pxにリサイズして表示する #7775

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

naokinaokiboo
Copy link
Contributor

@naokinaokiboo naokinaokiboo commented May 14, 2024

Issue

概要

プラクティスに設定できるOGP画像について、1200px × 630pxでリサイズして使われるよう変更しました。

画像のリサイズの仕様は以下のIssueに記載されています。

X(Twitter)で投稿した場合のOGP画像の表示

X(Twitter)で表示されるOGP画像に関しては、1200px × 630pxにリサイズされた画像が、さらに正方形に切り抜かれて表示されます。
Summary Card | Docs | Twitter Developer Platform

Facebookで投稿した場合のOGP画像の表示

Facebookで表示されるOGP画像に関しては、1200px × 630pxにリサイズされた画像が、さらにアスペクト比 1.91:1 にリサイズされて表示されます。
Images in Link Shares - Sharing

変更確認方法

  1. ブランチfeature/resize-ogp-image-in-practiceをローカルに取り込む
  2. 以下をそれぞれ確認する

OGP画像の選択/変更の項目の説明文の確認

  1. メンターアカウントでログインする
  2. プラクティス作成ページ(/mentor/practices/new)、プラクティス編集ページ(/mentor/practices/[practice_id]/edit)にアクセスし、OGP画像の選択/変更の補足説明文が以下のように表示されていることを確認する。

「ここにアップロードした画像が、X(Twitter)、Facebook で投稿した際に表示される画像として使われます。画像サイズが 1200px × 630px でない場合は、アスペクト比を維持したまま1200px × 630pxにリサイズして使われます。」

プラクティスのページで表示される画像の確認

  1. メンターアカウントでログインする
  2. 任意のプラクティスについて、OGP画像概要を設定する
  3. 手順2で設定したプラクティスのページ(/practices/[practice_id])にアクセスする
  4. 設定したOGP画像がリサイズされて表示されていることを確認する
  5. プラクティスのページのURLをコピーしておき、ログアウトする
  6. ログアウトした状態で手順5でコピーしておいたURLにアクセスする
  7. 設定したOGP画像がリサイズされて表示されていることを確認する

X(Twitter)、Facebook投稿時のOGP画像の確認

ngrokを使用して、ローカル環境を一時的に外部へ公開する必要があります。公開方法は以下を参照してください。

ngrok の導入手順・使い方 · fjordllc/bootcamp Wiki · GitHub

※テストで使用する画像は任意ですが、念のためテストで使用した画像を以下に置いておきます。
(1000 x 2000, 2000 x 630の画像は内側の四角形がそれぞれ1000px × 630px、1200px × 630pxになるように引いています。)

  1. メンターのアカウントでログインする
  2. 任意のプラクティスについて、OGP画像概要を設定する
  3. OGP画像が設定されたプラクティスのページのURL(/practices/[practice_id])をX(Twitter)とFacebookでポストする
  4. それぞれ、リサイズされたOGP画像を元に表示されていることを確認する
  5. プラクティスのステータスを修了にし、修了投稿するをクリック
  6. 喜びを投稿するをクリックしてX(Twitter)でポストする
  7. リサイズされたOGP画像を元に表示されていることを確認する

Screenshot

プラクティス編集ページ

変更前

image

変更後

image

プラクティス個別ページ

変更前

image

変更後

image

X(Twitter)で投稿時

変更前

image

変更後

image

Facebookで投稿時

変更前

image

変更後

image

@naokinaokiboo naokinaokiboo self-assigned this May 14, 2024
@naokinaokiboo naokinaokiboo marked this pull request as ready for review May 14, 2024 18:11
@naokinaokiboo
Copy link
Contributor Author

@sochi419
お疲れ様です。
こちらレビューをお願いできますでしょうか🙏(急ぎではありません)
もしご都合悪いなどありましたら、その旨、仰っていただけたらと思います。
何かご不明点などございましたら、お知らせください。
よろしくお願い致します。🙇‍♂️

@naokinaokiboo naokinaokiboo requested a review from sochi419 May 14, 2024 18:49
@sochi419
Copy link
Contributor

@naokinaokiboo

承知しました!
1週間以内を目処にレビューさせていただきます!

Copy link
Contributor

@sochi419 sochi419 left a comment

Choose a reason for hiding this comment

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

@naokinaokiboo

遅くなり申し訳ありません。

動作確認はOKでした!
プラクティスに画像を添付すると1200px × 630pxにリサイズされることを確認しました。
また、Xとfacebookで、リサイズされた状態で画像が表示されたことを確認しました。

コードに関して、1点だけ細かいですがコメントしていますので確認お願いします🙏

OGP_IMAGE_SIZE = [1200, 630].freeze

def ogp_image_url
ogp_image.variant(resize_to_fill: OGP_IMAGE_SIZE).processed.url if ogp_image.attached?
Copy link
Contributor

Choose a reason for hiding this comment

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

if ogp_image.attached?と定義しているのですが、views側でも同様のif文が記述されています。
こちらのif文に関しては、modelかviewsどちらか一方に記述すればいいと思ったのですがいかがでしょうか?

  • app/views/practices/_summary.html.slim(抜粋)
    - if practice.ogp_image.attached?
      = image_tag practice.ogp_image_url
  • app/views/practices/completion/show.html.slim(抜粋)
  if @practice.ogp_image.attached?
    set_meta_tags(og: { image: @practice.ogp_image_url, url: request.url })
    set_meta_tags(twitter: { image: @practice.ogp_image_url, url: request.url })

Copy link
Contributor Author

@naokinaokiboo naokinaokiboo May 28, 2024

Choose a reason for hiding this comment

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

まず、view側のif文は各viewにおいてその後の処理が異なるので基本的に必須だと考えます。
そこで、Decorator側のメソッドogp_image_url内でのif文が重複しているという意図だと認識しています。

このogp_image_urlが、今後もしもチェックをせずに使用された場合、このメソッドで以下のようなエラーが発生することになります。

undefined method `processed' for nil:NilClass

    ogp_image.variant(resize_to_fill: OGP_IMAGE_SIZE).processed.url
                                                     ^^^^^^^^^^

なのでogp_image_url側の条件文も必要だと考えているのですが、いかがでしょうか。

Copy link
Contributor

Choose a reason for hiding this comment

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

なるほど、エラーが発生してしまうのですね..

であれば、ogp_image_url側の条件文も必要だと私も思います。
(わざわざerror検証して頂きありがとうございました。)

@sochi419
Copy link
Contributor

@naokinaokiboo

レビューしました!
確認よろしくお願いします🙏

@naokinaokiboo
Copy link
Contributor Author

@sochi419
お忙しい中、レビューありがとうございます。😄
コメントして頂いた箇所について、返信を記載していますので、再度ご確認よろしくお願い致します。🙏

@sochi419
Copy link
Contributor

sochi419 commented Jun 2, 2024

@naokinaokiboo

レビューの返信ありがとうございました!
他に気になることは特になかったので、僕からはApproveとさせて頂きます!

@naokinaokiboo
Copy link
Contributor Author

@sochi419
お忙しい中、ご確認いただきありがとうございました😄🙏

@komagata
メンバーのレビュー通過しましたので、こちらレビューをお願い致します🙏

@naokinaokiboo naokinaokiboo requested a review from komagata June 3, 2024 10:55
@komagata
Copy link
Member

komagata commented Jun 7, 2024

@naokinaokiboo
Copy link
Contributor Author

naokinaokiboo commented Jun 22, 2024

@naokinaokiboo 既存のこちらの実装を参考にしていただければ~

@komagata
お疲れ様です。修正に当たって1点質問させてください。

既存の実装を参考に、プラクティスのogp_imageがattachされていない場合、デフォルト画像を返すように修正しようと思うのですが、ogp_imageのデフォルト画像として指定する画像は以下でよろしいでしょうか?
(現状、デフォルト画像を返したとしても、実際に表示される箇所はないため確認させて頂きました。)

/public/ogp/ogp.png

@komagata
Copy link
Member

@naokinaokiboo 基本的にはOKですが、プラクティスのOGP以外にもブログのOGPなどいろんな種類があるとおもうので、そのあたりデフォルトの画像がどうあればよいのかについて @machida さんと相談してみてください~。

@naokinaokiboo
Copy link
Contributor Author

@machida
プラクティスのOGPのデフォルト画像についてご相談させて下さい。🙏

まず経緯としては、対応にあたり、リサイズしたogp画像を返却するメソッドを追加しようとしています。
ただし、ogp画像を設定していない場合には、デフォルト画像を返却するような実装を予定しています。
そこで、使用するデフォルト画像とその表示について相談させてください。
具体的には以下の内容になりますが、他にご意見などあればよろしくお願いします。

  1. プラクティスのopgのデフォルト画像はどうあるべきでしょうか?
  • 現状、/ogp/ogp.pngが候補になるかと考えています。(レイアウトファイルの指定により、現状こちらがogpとして表示されるため)
  • また、ブログのogpでも、画像を指定していない(アップロードもしていない)場合は/ogp/ogp.pngが指定されています。
  1. プラクティス個別ページにはデフォルト画像は表示しないままでよいでしょうか?(ログイン時/未ログイン時)
  • 現状、ログイン時も未ログイン時もogp画像を設定していなければ、表示していません。

@machida
Copy link
Member

machida commented Jul 5, 2024

@naokinaokiboo

返信遅れてすいません!!

プラクティスのopgのデフォルト画像はどうあるべきでしょうか?

  • OGP のデフォルトは /ogp/ogp.png でお願いします。
  • OGPを設定していない場合、デフォルト画像は表示しないままでお願いします。

これでお願いしますー🙏

@naokinaokiboo naokinaokiboo force-pushed the feature/resize-ogp-image-in-practice branch 2 times, most recently from 9917d24 to 3ede618 Compare July 27, 2024 16:54
@naokinaokiboo
Copy link
Contributor Author

@komagata
ご指摘いただいたところを修正しました(リサイズ時の圧縮品質については、既存の実装の数値を参考にそのまま使用しています)
再度ご確認よろしくお願いいたします🙏

@@ -0,0 +1,17 @@
# frozen_string_literal: true

module PracticeDecorator
Copy link
Member

Choose a reason for hiding this comment

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

データを変更している(副作用が発生している)場合はDecorationの範疇を出ていると思うので、他と同じようにモデルの方に書いたほうがいいかもです。

Copy link
Contributor Author

Choose a reason for hiding this comment

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

確かに、元のファイルからサイズ違いの画像を作成・保存していて、表示に関するロジックだけとはいえないですね。💦
モデルに記載するようにします。

@naokinaokiboo naokinaokiboo force-pushed the feature/resize-ogp-image-in-practice branch from 3ede618 to b3a831f Compare September 6, 2024 14:45
@naokinaokiboo naokinaokiboo force-pushed the feature/resize-ogp-image-in-practice branch from b3a831f to 95d7b58 Compare September 18, 2024 08:49
@naokinaokiboo
Copy link
Contributor Author

@komagata
ご指摘いただいたところを修正しました。
再度ご確認よろしくお願いいたします🙏

Comment on lines +173 to +183
def ogp_image_url
default_image_path = '/ogp/ogp.png'

if ogp_image.attached?
ogp_image.variant(resize_to_fill: OGP_IMAGE_SIZE, autorot: true, saver: { strip: true, quality: 60 }).processed.url
else
image_url default_image_path
end
rescue ActiveStorage::FileNotFoundError, ActiveStorage::InvariableError, Vips::Error
image_url default_image_path
end
Copy link
Member

Choose a reason for hiding this comment

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

他のモデルでやっているようなこういうメソッドを用意するのは、ActiveStorageのバージョンが古い頃にすごく遅いという制限があったためにやっていることなので、新しく実装するこちらは普通に直接ogpを表示しちゃって大丈夫です。

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.

4 participants