Closed choco0809 closed 1 year ago
GET
ではなく POST
や DELETE
のような HTTP メソッドを使いましょうcalendars
というリソースに対応するテーブルは ER 図を見るところではないようですが /api/calendars/:id
の :id
には何の値が入りますか?PUT
または PATCH
を使うべきです/api/study_time_record/:id
のリソース名が複数形になっていないようです@cafedomancer
[質問] Web ページは React や Vue のようなライブラリを用いて作成するんでしょうか?
今回はVue + Railsの環境でWebページを作成しようと考えています。
- アカウント登録ページの URL が見当たらないようです
ペーパープロトタイプではDiscordでのログイン以外にメールアドレスにてユーザー登録できるよう考えていましたが、メイン機能がDiscord Botを使用して学習時間を記録するため、DiscordによるOAuth認証のみでユーザー登録をしようと考えています。 ※ ペーパープロトタイプの方も修正しておきます🙏
ログインページの URL が見当たらないようです
Discordでのログインのみ想定しているため、ログインページは作成しない想定です。 ※ ペーパープロトタイプを修正しておきます🙏
[質問] OAuth を用いないログインの場合はどこにリクエストが送信されますか?
Discordでのログインのみ想定しています。
ログアウトは GET ではなく POST や DELETE のような HTTP メソッドを使いましょう
ログアウトはDELETEメソッドに修正しました。
[質問] calendars というリソースに対応するテーブルは ER 図を見るところではないようですが /api/calendars/:id の :id には何の値が入りますか?
/api/calendar/1.json
のように、ログイン中のユーザーのidに一致する学習記録がjsonで取得できます。
よくよく考えたら、calendarと全く関係がないため、ここは/api/study_time_records/1.json
に変更しました。
[質問] 今月の学習時間を選択したときはどこにリクエストが飛びますか? [質問] 今年の学習時間を選択したときはどこにリクエストが飛びますか? [質問] 対象のセルをダブルクリックしたときはどこにリクエストが飛びますか?
ここはカレンダーに表示されている学習時間を選択したときという認識であっていますでしょうか?
/api/study_time_records/1.json
にリクエストした際の全学習記録をvuexで管理し、それぞれの日付、今月、今年が選択した際にvuex内のデータを加工しようと考えているため、別途リクエストを飛ばす予定はありません。
Web ページから学習記録を追加する場合のリクエストの送信先が見当たらないようです
失礼しました🙇🙇🙇 追加しましたのでご確認お願いします。
学習記録の更新は 更新 なので PUT または PATCH を使うべきです
PATHに修正しました。
/api/study_time_record/:id のリソース名が複数形になっていないようです
複数形に修正しました。
/api/calendar/1.json
のように、ログイン中のユーザーのidに一致する学習記録がjsonで取得できます。 よくよく考えたら、calendarと全く関係がないため、ここは/api/study_time_records/1.json
に変更しました。
/api/study_time_records/1.json
の 1
とは何の数字ですか? study_time_records
の id
なのであれば RESTful な URL として正しいのですが、そうでないなら正しくないので RESTful な URL になるように修正が必要です。
ここはカレンダーに表示されている学習時間を選択したときという認識であっていますでしょうか?
/api/study_time_records/1.json
にリクエストした際の全学習記録をvuexで管理し、それぞれの日付、今月、今年が選択した際にvuex内のデータを加工しようと考えているため、別途リクエストを飛ばす予定はありません。
はいそうです。学習記録のデータがたくさんある場合にその実装でパフォーマンス上の問題が発生する可能性はありませんか? 1 ユーザーあたり最大どのくらいの学習記録が作成されるのかを考えてみてください。
失礼しました🙇🙇🙇 追加しましたのでご確認お願いします。
RESTful な URL として正しくないです (id
が何であるかという問題もありますが) 。これまで作成した Rails アプリなどを参考に URL を見直してみてください。
追加の質問です。学習記録はどこから削除できますか?
@cafedomancer
/api/study_time_records/1.json の 1 とは何の数字ですか? study_time_records の id なのであれば RESTful な URL として正しいのですが、そうでないなら正しくないので RESTful な URL になるように修正が必要です。
user_idになります。見直してみると、/api/study_time_records/1.json
は相応しくないなと思いました。
また、アンダーバーをURLに使うのも相応しくなかったため、修正しました。
はいそうです。学習記録のデータがたくさんある場合にその実装でパフォーマンス上の問題が発生する可能性はありませんか? 1 ユーザーあたり最大どのくらいの学習記録が作成されるのかを考えてみてください。
パフォーマンスまで考慮できていませんでした🙏 年間、月間とでURLを分けました。
追加の質問です。学習記録はどこから削除できますか?
今のところ、学習記録はWEBページからのみ削除することを想定しています。
カレンダーの日付をクリックすると、その日の学習時間を一覧として表示し、その中に削除ボタンがあるイメージです。
削除ボタンが押されたときに、/api/study_time_records/:id
を叩いてあげたらよいかな~と思っています。
user_idになります。見直してみると、/api/study_time_records/1.jsonは相応しくないなと思いました。 また、アンダーバーをURLに使うのも相応しくなかったため、修正しました。
アンダーバーを使うのが相応しくないというのは何を根拠にそう判断していますか? 一般的な Rails アプリケーションのパスはアンダーバー区切り (snake_case
) だと思うのですが...。
パフォーマンスまで考慮できていませんでした🙏 年間、月間とでURLを分けました。
segment に含めるのでもよいですが /api/study_time_records?year=2022
のようにquery string にしておいたほうが作りやすくなるかなと思います。これだと study_time_records
というリソースの index アクションに紐付けられ、そのうちの year
が 2022
であるもののような作りにできるので。
今のところ、学習記録はWEBページからのみ削除することを想定しています。 カレンダーの日付をクリックすると、その日の学習時間を一覧として表示し、その中に削除ボタンがあるイメージです。 削除ボタンが押されたときに、/api/study_time_records/:idを叩いてあげたらよいかな~と思っています。
よいと思います 👌
PATH | /api/study-time-records/:id | 学習記録を更新する処理
PATH
ではなく PATCH
です。
@cafedomancer
アンダーバーを使うのが相応しくないというのは何を根拠にそう判断していますか? 一般的な Rails アプリケーションのパスはアンダーバー区切り (snake_case) だと思うのですが...。
過去のプラクティスに遡り、下記のページを見ていた時に下線は表示が難しいとの記述があり、なるほどたしかになと思いハイフンに変更しました。((4)アンダースコア(_)は、URIに使用しない)) https://meetup-jp.toast.com/931
segment に含めるのでもよいですが /api/study_time_records?year=2022 のようにquery string にしておいたほうが作りやすくなるかなと思います。これだと study_time_records というリソースの index アクションに紐付けられ、そのうちの year が 2022 であるもののような作りにできるので。
試してみたところ、たしかにquery stringの方が汎用性が高く便利でした💪
PATH ではなく PATCH です。
修正しました。(PATHを無意識で入力していました...)
過去のプラクティスに遡り、下記のページを見ていた時に下線は表示が難しいとの記述があり、なるほどたしかになと思いハイフンに変更しました。((4)アンダースコア(_)は、URIに使用しない)) https://meetup-jp.toast.com/931
(プラクティスに載っているという事実に対して、個人的な意見になってしまうかもしれませんが) 記事の内容の参考が Wikipedia しか示されていないため、この記事が信頼に足る内容であるとの判断ができませんでした。事実として、世の中のアプリケーションの REST API では kebab-case, snake_case, camelCase が混在しています。kebab-case を用いてもよいですが、先にも書いたとおり Rails アプリケーションの一般的なルーティングではないため、ルーティングの設定が若干面倒になります。この情報を踏まえてどの case を使用するか改めて考えてみてください。ただし snake_case を強要しているわけではないので自身の判断に基づいて kebab-case を選択してもらっても OK です 🙆
@cafedomancer
(プラクティスに載っているという事実に対して、個人的な意見になってしまうかもしれませんが) 記事の内容の参考が Wikipedia しか示されていないため、この記事が信頼に足る内容であるとの判断ができませんでした。事実として、世の中のアプリケーションの REST API では kebab-case, snake_case, camelCase が混在しています。kebab-case を用いてもよいですが、先にも書いたとおり Rails アプリケーションの一般的なルーティングではないため、ルーティングの設定が若干面倒になります。この情報を踏まえてどの case を使用するか改めて考えてみてください。ただし snake_case を強要しているわけではないので自身の判断に基づいて kebab-case を選択してもらっても OK です 🙆
たしかに参考がwikipediaでした。 参考元までしっかりと確認できていませんでした🙏(自分の確認不足でした) 今回、Railsを使用するのでレールに則った方が良いと思い修正しました。
確認しました! OK です 👌 (PATCH が PATH のままのようだったので直しておいてください)
@cafedomancer
2回目に提出したほうを修正していました😓
@cafedomancer DiscordとWeb(Vue.js)でレスポンスが異なるため、リソースを追加いたしましたので、ご確認おねがいします🙏
study_time_records
なので discord_
という prefix を付けるのではなく /api/discord/study_time_records
のような namespace を切るほうがよいのではと思いますresource
で定義するのであれば singular resource になるので単数形にしてください@cafedomancer namespaceを区切るように修正しましたのでご確認お願いします🙇♂️
OK そうです 👌
1回目
| method | path | description | | ------ | ----- | --------------------------------- | | GET | / | ログイン前、ログイン後のTOPページ | | POST | /auth/:provider/callback | OAuthを用いてログインする | | DELETE | /log_out | ログアウトする | | GET | /api/study_time_records/:id | 対象ユーザーの全学習記録を取得する | | POST | /api/study_time_records/:id | 学習記録を登録する | | PATH | /api/study_time_records/:id | 対象の学習記録を更新する | | DELETE | /api/study_time_records/:id | 対象の学習記録を削除する |2回目
| method | path | description | | ------ | ----- | --------------------------------- | | GET | / | ログイン前、ログイン後のTOPページ | | POST | /auth/:provider/callback | Oauthログイン処理、ユーザー作成処理 | | DELETE | /log_out | ログアウト処理 | | GET | /api/study-time-records/:year | 年間の学習記録を取得する処理 | | GET | /api/study-time-records/:year/:month | 月間の学習記録を取得する処理 | | POST | /api/study-time-records | 学習記録を登録する処理 | | PATCH | /api/study-time-records/:id | 学習記録を更新する処理 | | DELETE | /api/study-time-records/:id | 学習記録を削除する処理 |3回目
| method | path | description | | ------ | ----- | --------------------------------- | | GET | / | ログイン前、ログイン後のTOPページ | | POST | /auth/:provider/callback | Oauthログイン処理、ユーザー作成処理 | | DELETE | /log_out | ログアウト処理 | | GET | /api/study_time_records?year=yyyy | 年間の学習記録を取得する処理 | | GET | /api/study_time_records?year=yyyy&month=mm | 月間の学習記録を取得する処理 | | POST | /api/study_time_records | 学習記録を登録する処理 | | PATCH | /api/study_time_records/:id | 学習記録を更新する処理 | | DELETE | /api/study_time_records/:id | 学習記録を削除する処理 |リソース設計
補足
ログイン前、ログイン後のTOPページのURIが同じになっていますがbootcampと同様にview側で
current_user
である場合はログイン後のTOPページを、current_user
でない場合はログイン前のTOPページをrenderしようと考えています。 プロトタイプでの該当コード/api/study-time-records/:id
のid
にはstudy_time_recordsのidが入る想定です。/api/discord_study_time_records
はresourceで定義するため、:idは不要と考えています。 DiscordBotから終了時間(ended_at
)を更新する場合、常にlast
メソッドで取得したレコードを更新するためです。