スパルタコースでは毎週何かしらのイベントを開催しています。

今回は「Railsポートフォリオレビュー会」です。

あ、週に一人くらいまでなら無償でレビューできると思うのでお気軽にお声がけください。

動画

2020115 Railsポートフォリオ レビュー会 | TechEssentials

Image from Gyazo

雑なメモですが、こんなフィードバックをしました。

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のたいぽ?

https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/app/models/characteristic.rb#L2

こっちにdependent: :destroyをつけるのが正しいような気が

https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/db/migrate/20201201014421_create_shop_caracteristics.rb#L6

not null制約必要ない?

https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/app/controllers/shops_controller.rb#L44

punditなどの権限管理のgemを入れるか、before_actionでadminじゃなかったら弾くなどの制御を入れた方が良い

https://github.com/jus37/work-space/blob/1180c6bb8a5520d4fbfb80dd06da458f7213dc3b/app/models/shop.rb#L14

個人的には外部キーには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コミュニティへの招待リンク

ではでは。