from Qiita: Twitterにコードを身えばよく投稿したい
はじめに
きっかけ(こんな呟きを見かけた
twitter
できたもの
作成の過程で収穫物
- ActiveRecord Storage などの Rails 5.2
- Twitter Login 方法と仕組みなど
- JS の基礎(getElementById や setAttribute、文字カウントなど)
- AWS S3 関連
- XSS 対策
作成の前に
作成要件
- マークダウン投稿、シンタックスハイライト
- 投稿から画像生成
- AWS S3 に og:image 用の画像を保存
作成の流れ:予定
- rails new codr, Git init, heroku create、Active Storage
- AWS S3 あれこれ
- Twitter 登録、ログイン機能作成
開発環境
- vm : Linux Ubuntu (virtualbox + vagrant)
- Ruby 2.5.1p57
- Rails 5.2.3
- Postgresql
実作業
DB 設定等は割愛
Gem
rails.credentials.yml
当初は.gitignore
と dotenv
などを使っていたが、作成途中で Rails 5.2 からの rails.credentials.yml
を利用した。復号化には /config/master.key
を利用。
rails gあれこれ
ActiveRecord Associations関連付け
投稿関連
マークダウン投稿
html_safe => sanitize
ホワイトリスト方式の sanitizeヘルパー を使用した。
投稿内容のデータ化、AWSへの画像保存
Heroku では画像保持がされないので、作成画像を AWS S3 に保存し、og:image に添付する形を取った。
- Web アプリ内で通常投稿
- show ページ表示(同時に html2canvas で Base64 としてデータ取得、hidden_field に格納)
- ツイートボタン押す(Post され、post モデル内で base64 をデコード)
- Active Storage を通して、AWS S3 に保存
Active Storage
Rail5.2 からの機能で、今までの carrievave や paperclip などを使わずに、クラウドストレージ等へのアップロードが容易になる。今回は AWS S3 を使った。
rails credentials:edit
で AWS アクセスキーとシークレットキーを追加。
html2canvas
- ツイートボタン押下時に画像を Post するためのフォーム
hidden_field
を用意
html2canvas.js
を app/assets/javascripts
ディレクトリ配下に保存
- html 上に置く script コードを改修
Base64デコード
あとは posts_controller で、params から受け取った Base64 データを上の parse_base64(img)
で変換し、保存すれば完了。
AWS S3
AWS 上での登録、設定、バケット作成等は割愛。
og:imageに画像添付
なお、head の meta 情報セットには、gem 'meta-tags'
を使用
service_url()とurl_for()
基本的にはどちらも、ActiveStorage に保存したデータの Url を取得するメソッドの様だ。
どちらもセキュリティのためにリンクの有効期限が短いみたいだが、違いがわからなかった。今回はツイートボタン押下し、Tweet した際に og:image として表示されればいい。
TwitterDeveloperAccount が必要。割愛。
Twitter のニックネームが取得できるようになったので、元からある User の name テーブルは削除した。
改修(加筆
メディアクエリ
想定ユーザーは殆どスマートフォンなのに、パソコンで作成し、CSS をパソコンの見た目でやってた。折角 SCSS でやってるので、変数を利用した。
最後に
gist などがコードスクショを og:image で表示してくれたらすべて済むのでは