【定期勉強会】1/15 Railsポートフォリオレビュー会
スパルタコースでは毎週何かしらのイベントを開催しています。
今回は「Railsポートフォリオレビュー会」です。
あ、週に一人くらいまでなら無償でレビューできると思うのでお気軽にお声がけください。
動画
2020115 Railsポートフォリオ レビュー会 | TechEssentials
雑なメモですが、こんなフィードバックをしました。
portfolio感想(みけた)
感想
- 動きが早い
- 見た目がよい
- やっつけ感がなく、丁寧な印象が伝わる
– 実際のデータがあったりしてよい(適当なサンプルではない)
- やっつけ感がなく、丁寧な印象が伝わる
- faviconがあるあたり、こだわりを感じた
- エラーページなんかも用意するといいかも
概要
- なんとなく検索周りを見てみました
- その辺りを中心に思ったことをつらつらと書いてみました
application_controller.rbについて思ったこと
- 渡すインスタンス変数の数は、N+1問題に注意しつつ、少なくしてあげる方がい
- エラーページなんかも用意するといいかも
- https://github.com/jus37/work-space/blob/master/app/controllers/application_controller.rb
def set_item_search_query @q = Shop.ransack(params[:q]) @search_shops = @q.result(distinct: true).page(params[:page]).per(5) @search_shops_count = @q.result(distinct: true).count end
# controller側 def set_item_search_query @q = Shop.ransack(params[:q]) @search_shops = @q.result(distinct: true).page(params[:page]).per(5) end # view側でこう書いてはどうか # total_countというransackのメソッドを使いましょう! # [ kaminari/kaminari: ⚡ A Scope & Engine based, clean, powerful, customizable and sophisticated paginator for Ruby webapps](https://github.com/kaminari/kaminari#the-per-scope) @search_shops.total_count
shops/search.html.erb で気になったところ
- Bootstrapのクラスを活用して、レスポンシブにしていくといいかも
- usersテーブルでadminをboolean型にして、default: falseとかにした方がよかったかも
- 例えば、admin以外の権限を持つような種類のユーザーを想定して、integer型にした場合、enumというのを使うといいです
- user.admin?とかって書けます
- N+1対策をしてあげたほうがよさそう
- 例えば、shop.area.nameとviewに書いてあるところがあるので、includesメソッドを使ってあげて、事前にコントローラのところでarea含めてSQLを発行して取得してあげるとよさそう
- モデルにメソッドを作ってあげるとよさそう
- 例:
shop.reviews.average(:review_point).round(1)
<%if user_signed_in? && current_user.admin == 1%> <%= link_to 'お店登録', new_shop_path%> <% end %>
create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "name", null: false t.string "telephone", null: false t.text "comment" t.integer "admin" t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end
shops_controllerのdestroy
- おそらく、reviewsはdependent: :destroyで削除されるはず
- destroyするなら失敗した時を想定して、if else で分岐させる
- destroyの失敗を想定していないなら、destroy!を使う
- 誰でも削除できそう(なのでpunditとかを使った方がよい)
def destroy @shop = Shop.find(params[:id]) @shop.destroy @shop.reviews.destroy redirect_to root_path end
- 例:
User.all.destroy
失敗
User.all.destroy_all
成功
だいそん
https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/Gemfile#L38
あえてunicornを使ってる理由
https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/Gemfile#L71
developmentだけで良さそう
https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/Gemfile#L78
Bootstrap5系使ってる人初めて見た!笑
https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/Gemfile#L81
最近はpagyというgemが良さげ。パフォーマンスが良いとのこと。
https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/db/schema.rb#L113
adminというカラムだったらboolean型でよかったかも?roleだったらintegerでenumで管理する方針で良いと思う
https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/db/schema.rb#L77
characteristicsのたいぽ?
こっちにdependent: :destroy
をつけるのが正しいような気が
not null
制約必要ない?
punditなどの権限管理のgemを入れるか、before_actionでadminじゃなかったら弾くなどの制御を入れた方が良い
個人的には外部キーにはpresence: true
はつけてない。
comment = Comment.new(content: "foo", user: User.new(name: "taro"))
comment.valid?
# => false
になるため。
一覧画面のサムネイルはオリジナルサイズじゃない方が良い。variant使ってリサイズした方が良い。
https://qiita.com/kazuomatz/items/3cdbd2c40576c2e9d89b
スマホ対応すべし
東京のデータ入れて欲しい
マイページはユーザー情報の編集だけですまないことが多いので/users/edit
じゃなくて/mypage/
的なネームスペースを切った方が良さげ。
「最初のレビュー」はViewでshop.reviews.first
と取得するのではなく、has_oneやメソッドで切り出した方がコードの見通しは良くなる。
class Shop < ApplicationRecord
has_one :first_review, -> { order(created_at: :desc) }, class_name: 'Review'
# または
def first_review
reviews.first
end
@shop = Shop.find(1)
@shop.first_review
has_many :users, through: :clips, dependent: :destroy
has_many :clipped_users, throgh: :clips, class_name: 'User'
has_many :belongings
has_many :staffs, through: :belongings, class_name: 'User'
shop.clipped_users
shop.staffs
かろりーなさん
感想
- なじみのあるデザインで使いやすかった
- デザインが凝っていて、良い意味でよくあるポートフォリオ感がなく新鮮でした
- 検索の種類が幅広いので、条件に合わせて検索しやすかった(特に、コワキング以外にも満喫やカフェ等、ジャンルが広く探せるのはありがたかったです:大泣き: 普段Googleで何度も検索ワード変えたりして探してるので。。)
気になった点・あると嬉しい機能
- LPのレイアウトが崩れてしまっている(意図的なものでしたらすみません)
- 個人的にいちユーザーとして、現在地や最寄り駅から近い順で検索結果を並び変えられる機能があればうれしいなと思いました!
ながいさん
- t.float "review_point”はdecimal型がいいかも?floatだと小数点の発生する計算結果があやしくなります。消費税の計算とかが発生するのであればdecimalの方がいいかもしれないですhttps://qiita.com/yusabana/items/fd4a0185c1f120403a74
https://qiita.com/jnchito/items/d0ef71b25732ad5a881c
こんな感じで毎週勉強会をやってます。
スパルタコースはサポートの質が落ちないように少数のコミュニティとして活動しています。
実際に未経験からRailsの業務委託で仕事をしている人もいるくらいなのでちゃんと学習すればスキルはつきます。
普段はSlackでやりとりしてますのでリンクを貼っておきますね。
Slackコミュニティへの招待リンク
ではでは。