-
Notifications
You must be signed in to change notification settings - Fork 71
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
プラクティス > Docs一覧をVue.js化する #4293
Conversation
c794d70
to
64f77df
Compare
@garammasala29 さん、おつかれさまです。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@aim2bpg さん
お疲れ様です。レビュー依頼ありがとうございました!大変遅くなりすみません🙇♂️
手元でもVue化されることを確認できました。
default.mov
issueを作成された箇所以外のテストが通ることも確認できています。
日報で実装の意図などを丁寧に書かれていたので、内容をよく理解しながらレビューすることができました。LGTMです!
1点だけ気になる点があり、app/controllers/pages_controller.rb#index
でVue化に伴い不要なコードが見受けられ、どうしたらいいかなと考えていました。
@aim2bpg さんの今回の変更差分と関係ない部分ではありますが、少し気になったので記しておきます。
@garammasala29 さん、ご確認ありがとうございます🙇🏻♂️
|
@aim2bpg さん |
@garammasala29 さん、ありがとうございます。
上記の記述は、本Issueとは別ページの部品と思われますのでスコープ外とさせて下さい。 手元で上記の記述を削除してみると、たしかにDocs一覧ページも表示できましたし、テストもPassしました。 |
@aim2bpg さん
全然問題ありません、大丈夫です。気になる部分でしたので、共有させていただいてよかったです。 |
64accee
to
d294b83
Compare
@machida さん |
@aim2bpg 返信遅れてすいません。meta が付く方でお願いします。 ちなみに、付かない方のclassは こっちの大きい方ようのclassですね。 それが間違えて使われているっぽいです。 |
@machida さん、metaの方で承知しましたー🙇🏻♂️ |
d294b83
to
7ad8732
Compare
@@ -0,0 +1,14 @@ | |||
# frozen_string_literal: true | |||
|
|||
class API::Practices::PagesController < API::BaseController |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
APIを増やすのではなく、DocsのAPIにpracticeでの絞り込み機能を追加することで対応できればと思います〜
/api/pages?practice_id=1234
のようなURLになるイメージ。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ご提案ありがとうございます。おかげさまで、コードがスッキリしました〜😄
c4947e8
to
cf46d07
Compare
@komagata さん、#4293 (comment) の修正をしましたので、ご確認をお願いいたします〜🙏 |
app/javascript/pages.vue
Outdated
@@ -27,6 +27,7 @@ export default { | |||
page: page | |||
}, | |||
props: { | |||
practiceId: { type: String, required: true }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
通常の docs 一覧ページのほうの js のコードでは practiceId
を props として渡していないと思うので、required: true
にしちゃうとそっちで warning になっちゃう気がしました。このへんです。
bootcamp/app/javascript/pages.js
Line 12 in aa00f49
props: { selectedTag: selectedTag } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
エラーが出ないからと、リファクタしたつもりが裏目に出てしまいました。
下記の元の記述に戻すことで、ワーニングが出ないことを確認しました。
practiceId: { type: String, default: '', required: false },
if params[:practice_id] | ||
practice = Practice.find(params[:practice_id]) | ||
@pages = practice.pages.with_avatar | ||
.includes(:comments, | ||
{ last_updated_user: { avatar_attachment: :blob } }) | ||
.order(updated_at: :desc) | ||
.page(params[:page]) | ||
else | ||
@pages = Page.with_avatar | ||
.includes(:comments, :practice, :tags, | ||
{ last_updated_user: { avatar_attachment: :blob } }) | ||
.order(updated_at: :desc) | ||
.page(params[:page]) | ||
@pages = @pages.tagged_with(params[:tag]) if params[:tag] | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
params[:practice_id]
があるときもないときもベースになるクエリはほとんど変わらないと思うので、プラクティスによる絞り込みだけ conditional にやるのが良いのではと思いました 💡 Kaminari の page による絞り込みは先にあって良いのかちょっとわからなかったので、そのへんは調査してみてもらえると〜 🙏
if params[:practice_id] | |
practice = Practice.find(params[:practice_id]) | |
@pages = practice.pages.with_avatar | |
.includes(:comments, | |
{ last_updated_user: { avatar_attachment: :blob } }) | |
.order(updated_at: :desc) | |
.page(params[:page]) | |
else | |
@pages = Page.with_avatar | |
.includes(:comments, :practice, :tags, | |
{ last_updated_user: { avatar_attachment: :blob } }) | |
.order(updated_at: :desc) | |
.page(params[:page]) | |
@pages = @pages.tagged_with(params[:tag]) if params[:tag] | |
end | |
@pages = Page.with_avatar | |
.includes(:comments, :practice, :tags, | |
{ last_updated_user: { avatar_attachment: :blob } }) | |
.order(updated_at: :desc) | |
.page(params[:page]) | |
@pages = @pages.where(practice_id: params[:practice_id]) if params[:practice_id] | |
@pages = @pages.tagged_with(params[:tag]) if params[:tag] | |
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
こちらもご提案ありがとうございます🙏コードがスッキリしました😄
page絞り込みが先にあっても違和感なく動作することを確認しました。
test 'GET /api/pages.json' do | ||
get api_pages_path(format: :json) | ||
assert_response :unauthorized | ||
|
||
token = create_token('kimura', 'testtest') | ||
get api_pages_path(format: :json), | ||
headers: { 'Authorization' => "Bearer #{token}" } | ||
assert_response :ok | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
practice_id による絞り込みや tag による絞り込みのテストもあると better だと思うけど omakase です〜。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
たしかに、practice_id による絞り込みは実装してますのでテスト追加しました。
tagの方は、Vue.js化されていませんので対象外としています。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
今回の PR の範囲で言うとそうだと思うんですが、API 単体の仕様としてはタグでの絞り込みができる、かつここは API に対するテストを書く場所なので、仕様があるならそれを確認するテストもここにあるべきだと思いました。そしてこの機能は、通常の Docs の一覧のほうで使われていそう (タグ一覧からタグで絞り込める) です。ただ、この PR の作業範囲としてどこまでのテストの追加を含めるかというのはまた別の話なので、その点は引き続きおまかせです!
@cafedomancer さん、ご提案ありがとうございました。 |
test 'GET /api/pages.json' do | ||
get api_pages_path(format: :json) | ||
assert_response :unauthorized | ||
|
||
token = create_token('kimura', 'testtest') | ||
get api_pages_path(format: :json), | ||
headers: { 'Authorization' => "Bearer #{token}" } | ||
assert_response :ok | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
今回の PR の範囲で言うとそうだと思うんですが、API 単体の仕様としてはタグでの絞り込みができる、かつここは API に対するテストを書く場所なので、仕様があるならそれを確認するテストもここにあるべきだと思いました。そしてこの機能は、通常の Docs の一覧のほうで使われていそう (タグ一覧からタグで絞り込める) です。ただ、この PR の作業範囲としてどこまでのテストの追加を含めるかというのはまた別の話なので、その点は引き続きおまかせです!
test/integration/api/pages_test.rb
Outdated
test 'GET /api/practices/315059988/pages.json' do | ||
practices = practices(:practice1) | ||
get api_pages_path(practices.id, format: :json) | ||
assert_response :unauthorized | ||
|
||
token = create_token('kimura', 'testtest') | ||
get api_pages_path(practices.id, format: :json), | ||
headers: { 'Authorization' => "Bearer #{token}" } | ||
assert_response :ok | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あれ、なんか test の説明がおかしそう...? practice_id
は query string に入るはず。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
たしかに〜😇 /api/pages.json?practice_id=315059988
に修正しました🙏
app/javascript/pages.vue
Outdated
@@ -27,6 +27,7 @@ export default { | |||
page: page | |||
}, | |||
props: { | |||
practiceId: { type: String, default: '', required: false }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
default が空文字になっているのは、あんまり意味を成していないような気がしました。値が入っていないことを表現したいのであれば null
か undefined
を使う、もしくは props を渡さないときは practiceId
がそのように設定されるという挙動に任せておく、のどちらかが良いと思います。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
reports.vue
でnull
が使われていたので、pagesでもnull
を使用しました。
@cafedomancer さん、ご指摘ありがとうございました🙇🏻♂️ |
@cafedomancer さん、ご確認ありがとうございました🙇🏻♂️ 初めてレビューしていただいて勉強になりました〜 @komagata さん、#4293 (comment) につきまして、修正しましたのでご確認をお願いいたします〜🙏 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
確認しました、OKですー🙆♂️
Issue: #4048
概要
プラクティス > Docs一覧をVue.js化して、非同期に読み込むようにしました。
参考PR
Refs: #3852 他、#3963,#3181,#2537,#2450,#2286,#2280,#2260 を参照しました。
変更点
差分が大量となるため、レビュー効率向上と自分の備忘録も兼ねて、概要を以下に、詳細を日報にまとめました。
Routing
routes/api.rb
にpractices/pages#index
アクションを追記。Controller
app/controllers/api/practices/pages_controller.rb
を追加(既存のapp/controllers/practices/pages_controller.rb
を流用し、メソッド名の先頭にAPI::
を付加、継承元もAPI::BaseController
に変更)app/controllers/practices/pages_controller.rb
より不要となった@pages
の代入部分を削除。View
app/views/api/practices/pages/index.json.jbuilder
を追加(app/views/api/pages/index.json.jbuilder
を完全流用)app/views/practices/pages/index.html.slim
のVue.jsに置き換えたDocs一覧表示部分を削除し、Vue.jsのtemplateを埋め込むためのdiv要素を追記。app/views/pages/_page.html.slim
を削除。vue読込用JS
app/javascript/packs/application.js
にコンパイル対象のJSファイルpractices-pages.js
を追記。app/javascript/practices-pages.js
を追加(同階層のpages.js
を流用)vue
app/javascript/pages.vue
に追記。テスト
test/integration/api/practices_pages.test.rb
を追加以上の詳細情報は「日報」を参照ください。
2022-03-11 追記
本PRを参考とされる方はご注意ください。
本PRでは、すでにVue.js化されたトップページ > Docs一覧とコードをどう共通化させるかが課題でした。他のVue.js化にそのまま当てはまらないかもしれません。ただ、ファイルごとにどのような修正が入るのかイメージするのには参考となるかもしれません。
また、上記修正後のレビューで「APIを増やさずにDocsのAPIにpracticeでの絞り込み機能を追加した方が良い」との助言があり、作ったAPIを削る修正をしていますので、Files changedの最終形をいきなり作ったわけではなく、そういう修正の経緯があったことをご承知の上で参考とされてください。
動作確認