推奨リスト
テーブルのカラムにコメント
- 何のためのカラムなのかを明確にするため
- Rails6系から使用可能
- 設定値を管理する際にあると便利
ex) db/migrate/YYYYMMDD_create_members.rb
class CreateMembers < ActiveRecord::Migration[6.0]
def change
create_table :members do |t|
t.string :name, null: false, default: '', comment: '名前'
t.string :email, null: false, default: '', comment: 'メールアドレス'
end
end
end
メソッドにコメントアウト
- メンテナンス性の向上のため
ex)
# サイトのURLを返却する
def site_url
end
なるべくRailsの機能 (scope, active_support, association) を使用
- テストコードを最小限にするため
Rspec書く (単体テスト)
- gemやRubyのアップデートを定期的に行うため
- 不具合を極限まで抑えるため
定期的にRubyとRailsアップデート
- 最新バージョンに追従するため
- ライブラリにセキュリティホールが存在したり、サポート終了した際にすぐにアップデートできるようにするため
メソッド名や変数名は長くなっても意味が通るように
- 可読性向上のため
NGリスト
コールバック
- メンテナンス性が著しく落ちるため
STI
- 異なる振る舞いをするオブジェクトを同一テーブルに保持するケースが多いため
- STI化しても結局typeカラムの値で条件分岐する記述が出てくるため
ex)
return if type == "Server::Web"
エラーメッセージの二元管理 (ex: モデルレイヤー + validationEngine)
- 受け入れテストや単体テストがしづらくなるため
- jQuery等に依存するため
- モデルレイヤーに記述せず、validationEngineのみバリデーションを定義すると、検証ツール等でvalidationEngineの記述を外して容易に500エラーを起こせてしまうため
SQL直書き
- Railsの良さが出なくなるため
- 他の人が開発するときに効率が落ちるため
文字列足し算
- nilになった瞬間に500エラーになるため
- 式展開を利用する
ex)
# NG
# `host` がnilの場合、500エラーが発生する
def site_url
'https://' + host
end
# OK
def site_url
"https://#{host}"
end
Ruby Syntax
- 可読性向上のため
unless
- if !(condition) を代わりに使用する
ex)
# NG
unless user_signed_in?
# OK
if !user_signed_in?
end
ex)
# NG
def hoge
return if (condition1)
return if (condition2)
return unless (condition3)
end
# OK
def hoge
return if (condition1)
return if (condition2)
return if !(condition3)
end
nil? または blank?
- present? を代わりに使用する
- カラム名のアクセサであれば ActiveRecordの(column_name)? メソッドを使用する
ex)
# NG
@user.name.nil?
# OK
@user.name?
# NG
@shop.company.nil?
@shop.company.blank?
# OK
@shop.company.present?
none?
- any? を代わりに使用する
# NG
@shop.web_servers.none?
# OK
!@shop.web_servers.any?