Help us understand the problem. What is going on with this article?

初学者が今すぐできるRailsポートフォリオのリファクタリング7つ

転職活動中に作成した自分のポートフォリオを見返していると、クソみたいにコードが汚かったので、リファクタリングしたことをまとめました。これから転職活動をしたりする人の参考になれば、と思っています。リファクタリングしたのがこのリポジトリなのでcloneして、中身をみつつ記事の内容を参考にして頂ければと思います。

インデントを揃える。

インデントが揃っていないとそれだけで、大幅にやる気を削がれてしまいます。Rubyのプロジェクトではインデントは半角の空白が2つなので、これに合わせるようにしましょう。

editorconfigを入れおくとインデントサイズを指定できるので、まだ設定していない人は設定しておくことをおすすめします。

routes.rbresourceを使って書く。

routes.rb
  post 'users/:id' => 'users#update'
  get 'users/:id/edit' => 'users#edit'
  post 'users/create' => 'users#create'
  get 'users/index' => 'users#index'
  get 'users/:id' => 'users#show'
  post "users/:id/destroy" => "users#destroy"
routes.rb
resources :users

Qiitaの記事で「初学者はresourcesを使うな」という内容の記事を見かけたことがありますが、確かに最初は1つ1つの挙動を確かめやすいという点で良いかもしれませんが、現場で上記NG例のような書き方をすることはないので、resourcesは使いましょう。

共通化できることは、テンプレートに切り出す。

例えばユーザ投稿を一覧表示するようなviewに関しては、トップページ及び関連投稿などの箇所で何度も呼び出すことがあるでしょう。こういったときは、以下のようにパーシャルに切り出して呼び出すと便利です。

app/views/posts/show.html.erb
<%= render "shared/menu" %>

viewのロジックが複雑になる場合には、helperに切り出す。

例えば投稿にサムネイルが紐づいている場合にはそれを表示する、紐づいていない場合にはデフォルトの画像を表示するみたいなロジックがあるとしましょう。これは、サービスの中で何度も記述する可能性が高いため、helperに切り出したりすると便利です。

posts_helper.rb
def display_thumbnail(post)
  if post.thumbnail.attached?
    image_tag post.thumbnail
  else
    image_tag 'default_thumbnail'
  end
end
views/posts/show.html.erb
# サムネイルの呼び出しはこの一行で共通化できる
<%= display_thumbnail(post) %>

僕のリポジトリでもhelperをよく使っています。

またdecoratorを使ってもロジックの切り出しを行うことができます。

参考: Rails Viewの表示のためにDecoratorを用意してHelperとModelを助ける - Qiita

よく使うクエリをscopeに切り出しておく。

controllerでSQL文をゴリゴリ書くのではなく、scopeに定義しておくとスマートなコントローラにすることができ、Fat Controllerになるのを避けることができます。

models/post.rb
class Post < ApplicationRecord
  scope :published, -> { where(published: true) }
end

参考: スコープ - Railsガイド

Rubocopでコードを自動で綺麗にする。

RubocopというGemを入れておき rubocop --auto-correctを実行するとコードを規約に基づいた形式で、自動修正をかけることができます。さらにOvercommitでコミットするとき時自動でrubocopを実行するようにしておくと、汚いコードが入り込む余地を限りなく排除できるのでおすすめです。

Rubocopの使い方に関しては、以下の記事がよくまとまっていて読みやすかったです。

少ない行で書く工夫をする。

後置if

<%= render 'layouts/welcome' if user_session.nil? %>

unlessを使う

<%= render 'layouts/welcome' unless user_signed_in? %>

この辺については伊藤淳一さんの[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとかが参考になるので、みなさん一読することをおすすめします。

特にRails編は僕も今でもちょくちょく読み返してリファレンスとして活用させてもらっています。

kenz-dev
恵比寿で動画サービス作っているRubyエンジニアです。今年は筋トレを頑張りたい。
https://kenzoblog.netlify.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした