PartsSync開発日誌
S3とCloudinaryどっちにしたらいいのかわからないけど、必要要件としては以下の通り。
・画像の自動リサイズ
・CDNで読み込みを早く表示させたい
・ウォーターマークすぐではないけど入れたいかも
・当面は25GB(Cloudinaryの無料枠)以内の利用となりそう
メリット | デメリット | |
---|---|---|
Clourinary | ・短期中期的に導入工数が少なそう | ・月25GBを超える容量の場合は$99/月必要 ・その場合は、S3へ移行必要? |
S3 | ・コストが安そう (公式計算ツールによると 写真10万枚で1000円以下の見積もり) |
・各要件満たすために別々に機能の導入が必要 |
という感じなので、導入しやすさを優先してCloudinaryで実装してみる
こちらを参考にしながら、手を動かしつつCloudinaryを無事に実装できそうか検証してみる。1-2日かかるかな。
Cloudinaryが提供しているウィジェットを使ったら、Carrierwaveを使わなくてもCloudinaryへのアップロードができるようになる気がする。
大変そうだな。。1週間は沼るかもしれない。初期スコープではそもそも必要ない機能ではあるし、MVPリリースからは外すべき。ざっくりの難易度を把握できただけでも収穫としよう。
使いたいオプションメモ
・プレビュー機能
・複数枚同時アップロード
SourceryとDeviseどちらを認証に使うか
→将来的にユーザー権限管理をしたいので、punditと組み合わせの良いdevise一択
READMEに導入してみたい。とりあえず今は重要じゃないので後回し
Rubocupが覚えがないのに入ってて、なぜかと思ったけどRails7系から自動的にgem追加されているらしい。あと、CI用のファイルも自動的に追加。Railsなんて便利なんだ。
画像遷移図は上記を参考に作成してみることとする。この流れが一番スムーズにいけるかも。
v0で自然言語でフロントモック作成
↓
ローカルでNext.jsプロジェクトの立ち上げ
↓
V0.devから生成したUIをインストール
↓
localhost:3000をhtml.to.designでスクショ
↓
Figmaでhtml.to.designプラグインを使用して、h2dファイルをインポート
↓
微調整
ローカルでNext.jsプロジェクトの立ち上げ
こちら挫折したので、代替案としてbolt.newかGPT-Engineerでモックを作成→デプロイだとうまくいった!
こういうイケてるgif画像をOGPとかREADMのアイキャッチにほしいな。動画生成AIとかでツールの概要ががわかる8秒動画に概要を込める。
メモ
画面遷移図にLPを加える。
daisyUIでほしいモーダル無い、、、TailwindUIならあると思ったがdaisyUIのモーダルコンポーネントに別のコンポーネント差し込むことで解決しそう。
daisyUIの良さがあまりわかってなかったが、TailwindUIしかり、Tailwindのユーティリティを詰め込む方式で提供されているUIライブラリもあるらしい。
デザインについて
ENDさんのがよくまとまってる。
あたり場の制作者の方が参考にしたらしい
↑上記サイトの露草の類似色
カオスな情報を整理したBefore/Afterの提示のために、スプレッドシートのスクショをモザイクかけて、単月で1000品以上販売されているシートを示せるといいかも。
windframeを用いて、tailwindベースの開発にすることにした。それにともない、daisyUIが不要ということで、sprocketsやcssbuilding-rails, jsbuilding-rails等のGem、Node.jsが不要となり、importmap-railsでモジュール管理をして、tailwindcss-railsがあれば開発できることに気づく。
そこで、新しく環境構築からやり直したくなって、rails newしたけどカレントディレクトリに生成されたはずのファイルが表示されなくて、findコマンドとかでも見つからなくて、沼。
結局、新たにディレクトリ作成してそこでdockerfile, docker-compose.yml, gemfile, gemfile.lockを作成して進めたところ無事に解決した。
1から進める際には以下の記事を参考にファイルの中身はコピペした
docker compose up時に必要なgemがインストールされていないというエラー発生。
docker compose run web bundle installとしても、docker compose run web bashからbundle installしても改善しない。
↑docker compose buildができていないために起こった現象だった。
その後、database.ymlに追加の記述を行って(理由はわかってない)、docker compose run web rails db:createしてからdocker compose upしたらrailsサーバーが立ち上がった。
default: &default
adapter: postgresql
encoding: unicode
host: db #追記
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: postgres #追記
password: password #追記
windframeの出力するhtmlがクセが有ることがわかってきた。コンポーネント単位をGUIでつなぎ合わせるまでは良いが、コードを出力するときには全体の構成は考慮されておらず、レイアウト崩れが容易に発生するので自分で整えないといけない。
deviseは何の苦労もなく導入まではできた。カスタマイズしようとしてGitHub覗きに行き始めたら沼るのかもしれない。けど、それでもCursor使ってるからか、開発速度は使わないのと比べて雲泥の差のような気がする。
ログアウト機能を作成するためにも、ルートのページを売上管理画面(仮)作成して、そこからログアウトフォームを作って、ルーティング、コントローラー、ビューの設定をする。企画初期にUI作成とエディタの選定に力入れたらから開発効率たぶん良くてスムーズで嬉しい。
基本的には1テーブルにつき1つが推奨されるようなので、24個もモデル作ることになりそう。何かしらの構造化が必要なのでは?と思わざるを得ない。例)Rails応用カリキュラムにあったポリモーフィックなど。技術面談使おう。
deviseのログアウトボタンを設置して、ログアウトしようと思ったらHTTPメゾットがgetでブラウザから送られてしまってルーティングエラーが発生中。原因分析に20分くらい沼っている。
どうやらrails-ujsが正しく読み込まれていないっぽいぞ
rails-ujsは使えるようになったのに、まだroutingエラーが続く...
コントローラーの記述見直したら5秒で治った
gpt-o1-miniがGitHubのトークンが外部に漏れてる可能性があるから、今すぐにトークンを更新するように警告してきた。とはいえ、環境変数のファイルはgitignoreに追加済だし、エディタ側のPrivacymodeもonにしてるから問題はなさそう。
エディタ内で実装の手引を細かく聞いて、それを基に実装する場合はもうこれは実質issueとして十分な情報量なので、これをGitHubCLIを用いて自動化したい。
AIに細かに聞いた実装手順を要約してマークダウンでチェックボックス化→GitHubCLIにてissue化を自動化したい。
ひとまず、GitHubCLIでテスト投稿できるとこまではすぐできたけど、issue化したり、リポジトリに割当て等のオプションがなかなかできない。
最初からgh item-createでissue化ができない
↓
gh issue create してから、gh item-addを検討
↓
gh item-addするためにissueのURLが必要だが、URLの取得に詰まる(いまここ)
ISSUE_URL=$(gh issue create --title "GitHub CLI チェックリスト" --body-file checklist.md --assignee masaengineer --label "タスク" --json url --jq '.url')
gh project item-add 2 --url "$ISSUE_URL"
これでいけた!
できた!シェルを実行すれば指定ファイルにまとまった内容をMarkdown形式で自動でissue化できる
まぁ、次回からこの機能使うようにはするけど本来ならコマンド一つ打てば自動でissue用に要約が始まって、Pushするまでやってほしい。現状だと、要約の指示と専用のmdファイルへのコピペは行う必要がある。実現するには、シェルでCursorのAPIを叩く必要がありそう。今の技術力だとちと時間かかりすぎるので、また宿題としよう。
GitHubのプロジェクトで「ストーリーポイント」というフィールドに数値を追加するためには、GitHub CLIを使ってGraphQL APIを呼び出す必要があります。以下のように、gh api graphqlコマンドを使用して、指定したフィールドに数値を設定します。
やっぱシェルからissue化しようとしたら、ちょっとまだ自分のスキル感だと自由に扱いづらいな。Reactとバックの通信はGraphQLがよく使われるみたいなので、そのタイミングで再チャレンジするのが学習効率良さそう。
なぜGitHubActions公式のCIファイルを使ってるのにエラーが起きるのか。
CIファイルの沼から抜け出せない。
ひとまず公式のRubyやgem-pushファイルはRailsプロジェクトには不要ということだけはわかったので削除。
dockerで環境変数を使う辺りで知識不足でAIの提案が何やってるのかわからなくなってコードを補完したり、消したりで沼。一旦飛ばして、時間があるときにUdemyとかで体系的に学習しよう。
deviseのconfirmable(新規登録時にメール認証を必須にする)を有効にしたところ、エラーに詰まってしまい2-3時間沼る。
letter_opnerの設定が原因と思われるので以下のデバッグを実行。が、解決しないので一旦confirmableの機能は先送りして別の開発を進める
Devise Confirmableの有効化過程でのエラーと対処方法
エラー1: マイグレーションエラー
エラー内容
add_confirmable_to_users
マイグレーションを実行中にエラーが出た。
対処方法
- マイグレーションファイルを見直して、
confirmable
に必要なカラムがちゃんと追加されてるか確認した。 -
db/migrate/20241120080231_add_confirmable_to_users.rb
とdb/migrate/20241120080625_add_confirmable_to_users_2.rb
の内容をチェックして、重複やミスがないか確認した。
エラー2: メール送信エラー
エラー内容
ユーザー登録時に確認メールが送られない。
対処方法
-
config/initializers/letter_opener.rb
を確認して、メール送信の設定が正しいか見た。 -
Gemfile
にletter_opener
が入ってるか確認して、bundle install
を実行した。
エラー3: ルーティングエラー
エラー内容
確認メールのリンクをクリックしたらルーティングエラーが出た。
対処方法
-
config/routes.rb
を確認して、devise_for :users
がちゃんと設定されてるか確認した。
エラー4: モデルの設定エラー
エラー内容
User
モデルにconfirmable
がちゃんと設定されてない。
対処方法
-
app/models/user.rb
にdevise :confirmable
が入ってるか確認した。
その他の注意点
-
db/schema.rb
が最新の状態か確認して、必要ならrails db:migrate
を実行した。 - Dockerコンテナ内で作業してるなら、
docker-compose exec web rails db:migrate
とかのコマンドを使うといい。
結局、confirmable関係ではなく、recoverbleの実装においても先程のスクショと同じエラーが出る。これ解決できたら、逆にconfirmableもうまくいくかもしれない。
config/environments/development.rbに、同じ記述が複数個ある設定がいくつかあったので、これが原因かと思ったが違う様子。
解決!エラーの原因は以下の通り
エラーの原因特定
-
エラーメッセージ:
-
NoMethodError
が出ていて、letter_opener_url=
というメソッドが見つからないと表示されている。 - これは、
ActionMailer::Base
にそのメソッドが存在しないことを示している。
-
-
設定の不一致:
-
letter_opener
やletter_opener_web
の公式ドキュメントには、letter_opener_url
という設定は載っていない。 - だから、誤って追加された設定だと考えられる。
-
-
他の設定との整合性:
-
letter_opener
やletter_opener_web
を使うには、delivery_method
を設定するだけで十分。 - そのため、
letter_opener_url
が不要であることから、エラーの原因と判断した。
-
解決策
-
config.action_mailer.letter_opener_url
の行を削除する。 -
development.rb
の設定を見直して、正しい設定にする。
まとめ
-
letter_opener
やletter_opener_web
を使うときは、公式ドキュメントを参考にして、不要な設定を避けることが大事。 - エラーメッセージをよく読み、どの部分が問題かを特定するのがポイント。
よし、もともと予定してなかったけどi18n-tasksで国際化されてないロケールを自動的に検出できるようになった!
設定済みの翻訳が未設定と誤検出されるのでもうういいかな、、と一瞬思ったが公式リポジトリを見に行ったら解決した。パスの設定以外にも、専用のファイルをconfigに作らないといけなかったみたい。公式見るのは大事だわ〜
知らぬ間にAIのハレーションを信じて、deviseのコントローラーをカスタマイズする方針を採用してしまっていたので、関連のコントローラーすべてとルーティングの設定を標準に戻した。(無事に動作確認OK)
ただし、まだフラッシュメッセージは出てくれないので明日に引き続きデバッグする。
そういえば、
#バリデーションエラーの表示
<%= render "devise/shared/error_messages", resource: resource %>
って入れ込みはあったけど、これはそもそもflashオブジェクトを呼び出しているのか?否。
layout/application.html.erbに以下の記述を入れればflash_messageはブラウザに表示されるようになった。
<body>
<main class="relative min-h-screen">
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
</main>
参考
claude曰く、turboとrails-ujsが競合している...? Rails7ではrails-ujsは不要?
rails-ujsがなんだったか忘れていてさっぱりなので、調べまくらないと消して良いのか判断できない
あと、気になる点としてHotwire導入してるのにログにas TurboStreamではなく、as HTMLとなっている。Turboうまく使えてない?
あまり良くわかってないけど、rails-ujsおよび関連記述(app/assets/config/manifest.js, config/importmap.rb)を消してみたけど開発環境では特にエラー出なかったからこのままでいこう
しかしながら、依然としてas TurboStreamとはなっていない。
サーバー再起動したらTurbo読み込まれるようになった!
Deviseでビューファイルがデフォルトでは味気ない素のHTMLのみだったように、フラッシュメッセージに関する記述もカスタマイズして使う必要がある?
↓
公式をみていたところ、DeviseとHotwireを統合するための処理が書かれていたが、これはすでにできていて問題なさそう。
Railsガイド曰く
flashはセッションの特殊な部分であり、リクエストごとにクリアされます。つまり、flashは「直後のリクエスト」でのみ参照可能になるという特徴があり、エラーメッセージをビューに渡したりするのに便利です。flashにアクセスするにはflashメソッドを使います。flashは、セッションと同様にハッシュで表わされます。
だそうなので、特に設定していないけどdeviseの内部的な処理によってflashオブジェクトにはアクセスできていて、かつビューファイルへは表示できている。
というか、devise関係なしにRails自体のフラッシュメッセージってどうやって設定してたっけ。
↓
app/assets/stylesheets/application.cssにフラッシュメッセージのCSSを記述しよう的な記事をいくつか見つけたけど、tailwind前提でも同じ...?
→tailwindで上記ファイル編集してみたけどフラッシュメッセージは変わらない。
検証ツールのコンソールでは上記のエラーがでるが、バリデーションエラーが起きているということなので、意図している動きではある。フラッシュメッセージの装飾とは関係なさそう。
デバッグ用にbinding-pryいれようかなーと思ったけど、rails7だと標準的にdebugが装備されていて、高速らしい。使い方よくわからんが触ってみる。
そうか、daisyUIみたいなコンポーネントライブラリを使ってないし、RailsはCSSライブラリなしではデザインまではよしなにやってくれないのか。Tailwind単体でやっていく場合は、フラッシュメッセージも自分でstylesheets/application.cssに記述していく必要があるのね。。
これまで最初からBootstrapがあたってるカリキュラムやdaisyUIの自作アプリしか作ってこなかったから勝手にフラッシュメッセージにデザインあたってて学ぶ機会を逃してた。
フラッシュメッセージ自動で消えるようにするためにはTurbo(drive, frames, streams)だけでは実装できなくて、Turboで表示させてからStimirusで自動的に消えるようにすることが必要な模様。