[翻訳]開発者が避けるべき8つのRailsのよくあるミス

原著者[Hunny Jummani](https://medium.com/@jummanihunny)氏の許諾を得て翻訳・公開しています。
記事: [The 8 Most Common Rails Mistakes Developers Should Avoid](https://medium.com/@jummanihunny/top8-common-mistakes-avoided-by-ruby-on-rails-developers-1786e70266f0)
原文公開日: 2020年4月22日

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406773/d809ce40-46a4-8cd1-4b90-577610567771.png)

Ruby on Railsはスケーラブル可能なパワフルなWebフレームワークで、完全なフロントエンドのサポートを持ったエンタープライズ対応のアプリケーションです。設定より規約やMVCパターンのようなRuby on Rails開発のシンプルな点が、高機能のアプリに対して信頼性を高めています。

Railsの開発者は、開発時間を短縮したり余計なコードを書かなくて済む**RubyGems**を好んでいます。RubyGemsは標準的なプラクティスに従い、高速に**MVPs**をビルドし、製品の市場投入時間を短縮しています。

ですが、Railsの開発者は完璧ではありません。Ruby on Railsプロジェクトには固有の誤りはありませんが、一般的にはヒューマンエラーにより問題が発生します。
Ruby on Rails開発者には、経験を積むことでしか乗り越えられない落とし穴があります。この記事では、プロジェクトを頓挫させてしまう可能性がある8つのよくあるRuby on Rails開発のミスにスポットを当てています。

# Ruby on Rails開発者が避けるべき8つの最もよくあるミス

以下のRails開発者のよくあるミスは、プロジェクトのボトルネックとなることがあります。心配しないでください、将来あなたがこれらのミスをしないための解決方法を提供しています。Ruby on Railsプロジェクトでこれらのミスを避け、お客さんのためにバグのない解決方法を開発するためのためのガイダンスを提供します。

## ミス #1: N+1クエリ
アプリケーションに問題が発生することはありませんが、アプリケーションのパフォーマンスに影響を与えます。

**例:**

```users = User.where(is_active: true)
names = users.map { |user| user.profile.name }
```

レコードに関連づいたクエリを投げている間は、N+1クエリを避けることができます。

**例:**

```users = User.where(is_active: true).includes(:profile)
names = users.map { |user| user.profile.name }
```

クエリの数を減らしてアプリケーションのパフォーマンスを向上させ、eager loadingを追加するタイミングを知らせてくれるbullet gemを使いましょう。

## ミス #2: 設定を安全に保っていない
アプリケーションは[Google カレンダー](https://www.botreetechnologies.com/blog/how-to-create-events-in-google-calendar-from-ruby-on-rails-application)やStripe Payment、[AWS](https://www.botreetechnologies.com/aws-devops-services)のような外部サービスを使う可能性があり、そのAPIキーやクレデンシャルは```credentials.yml```や```secrets.yml```ファイルに保存されています。

そのファイルは残りのアプリケーションと一緒にソースコードリポジトリに誤ってチェックインされてしまうことがあります。これが起きると、リポジトリにアクセスできる誰もが簡単にアプリケーションのユーザを危険に晒すことができてしまいます。

## ミス #3: ロジックをコントローラに詰め込みすぎる

開発者は、コントローラ内のロジックが多すぎます。コントローラを薄くしておきましょう。単一責任の原則に違反してはいけません。

**何を含めればいいのでしょうか？**

セッションハンドル、モデル選択、パラメータ要求の管理、レンダリング、リダイレクトです。

## ミス #4: ロジックをモデルに詰め込みすぎる

開発者は、emailの通知や、あるフォーマットから別のフォーマットへのデータ変換などのロジックを、モデルに詰め込みすぎています。

このコア機能はプレーンなrubyオブジェクトのようなサービスを使用して処理できるので、```ActiveRecord```から削除することができます。)

**何を含めればいいのでしょうか？**

**構成** (例：リレーションやバリデーション)

データベースで一握りの属性を更新、保存することをカプセル化するための**シンプルなミューテーションメソッド**

内部モデル情報を隠すための**アクセスラッパ**

**例:** ```first_name```と```last_name```の組み合わせを表すfull_name

**洗練されたクエリ**。モデルクラス外で```where```メソッドを使ったりクエリを構築してはいけません。

## ミス #5: 外部サービスの呼び出しによるブロック

Ruby on Railsアプリケーションのサードパーティ提供者は通常、APIの統合を非常に簡単にしてくれますが、速度が遅くなることもあります。

そのため、呼び出しでブロックされないために、Railsアプリケーションからサービスを呼び出すのではなく、コードのいくつかをバックグラウンドジョブに移動させるべきです。

これらのAPIサービスをキューイングするには、***Delayed Job、Sidekiq***などを使う必要があります。

## ミス #6: 不適切な述語メソッドの使用

述語メソッドは***クエスチョンマーク(?)*** で終わり、論理値を返すメソッドです。

述語メソッドを作る時は、その目的について知っておくことが大切です。

メソッドが実行するものに名前をつけるべきであり、実行するアクションと名前が矛盾してはいけません。

例えば、ユーザが本を持っているかどうか確認するために、以下のようなユーザモデルで述語メソッドを定義すべきです。

```def books_available?
  self.books.present?
end```

## ミス #7: メモ化を使ってない

メモ化はRuby on Rails開発でアクセッサのスピードアップに使用されるテクニックです。
変数の初期化や手間がかかる作業のメソッドの結果をキャッシュします。

キャッシュの変数を初期化するためには``` ||= ```を使用します。

パラメータの値や関連するレコードから変数を初期化するために使用されます。

例:

```def google_calendar_event```
```@event ||= GoogleCalendarEvent.find_by(event_id: params[:event_id])```
```end```

## ミス #8: Ruby on Railsプロジェクトの命名規則に従っていない

開発中は以下のポイントを心に留めておいてください。

- テーブル名は、モデルとテーブルを自動的にマップするために複数形にしてください。

- モデル名は単数形にしてください。

- クラスで予約名を使わないでください。例えば、**"Class"** は使えませんが、**"Klass"** は使えます。

- コントローラ名は複数形にして、複数の単語を使いたい場合は**キャメルケース**を使ってください。

- 複雑さを避けるためにデフォルトのRESTfulのルートに従ってください。

Ruby on Railsは、ウェブアプリケーション開発のためのパワフルで多機能なフレームワークです。Ruby on Railsアプリケーションがいくつかの限界を持つ一方で、デプロイメントやデバッギングをしている間、開発者が注意を払っていないためにミスが起きてしまいます。

上記のミスを避けることで、一流のRuby on Railsアプリケーションを構築できます。[Ruby on Railsアプリケーション開発のリーディングカンパニー](https://www.botreetechnologies.com/)であるBoTreeでは、アプリケーションからバグを取り除くためのRubyベストプラクティスに従っています。当社の開発者は経験豊富なので、これらの失敗を学んでおり、プロジェクトを頓挫させないようにしています。高速でエラーがない開発のために、当社から[Ruby on Railsの開発者を雇う](https://www.botreetechnologies.com/hire-ruby-on-rails-developers)ことができます。

**[詳細はこちらをクリックしてください。](https://www.botreetechnologies.com/ruby-on-rails-development)**

**BoTree Technologie** では、25名以上のエンジニアのRuby on Railsチームでエンタープライズアプリケーションを構築しています。

私達は、Python、RPA、AI、Django、Javascript、ReactJSも専門としています。

**[コンサルティングは無料です。](https://www.botreetechnologies.com/contact)あなたの成長のお手伝いをさせてください。**

# 翻訳を終えて
仕事でRails開発を始めて間もないので、このようなアンチパターンを知ることができ、助かりました。
上記の中でN+1は有名なので知っていましたが、メモ化はその存在自体を全く知りませんでした。
なるべく落とし穴にはまらないように進めていきたいですね。
誤訳等ありましたらご指摘をお願いします。