読者です 読者をやめる 読者になる 読者になる

Yamakichi’s blog

yamakichiの技術ブログ

Rails 自分なりのapp以下のディレクトリ構成

Rails

RubyのアプリケーションフレームワークRailsは便利なもので、

コマンド1つでアプリケーション開発を行うために必要な環境を一瞬で構築してくれます。

さらにRailsは開発を快適にかつ、素早く行っていけるように設計されており、

近年のWebスタートアップ系の企業企業でも多くRailsが採用されています。(Airbnb など)

現在Railsは4.2系が最新の安定版としてリリースされていますが、今年の秋にはRails5がリリースされる予定です。

今回はそんなRailsのapp以下のディレクトリ構成について書きたいと思います。

あくまで自分なりのアプリケーションを快適に行っていけるようにするための構成ですのでこれが絶対に正しいとかではないです。

逆にこうしたほうが良いよってことがありましたらコメントなりいただけると嬉しいです。

デフォルトのapp以下の構成

rails new をした際にappには以下のディレクトリが設けられます。
・assets
・controllers
・helpers
・mailers
・models
・views

一つ一つ簡単に説明していくと

assets

JavaScriptCSSソースコードをおいて置く場所です
画像などもここに置きます

controllers

controller ファイルをおいて置く場所です。
MVC アーキテクチャの中でもViewとmodesの間でデータの受け渡しを行います
moldeに紐付いたcontrollerファイル名前部分を複数形に、逆に紐付かない場合は単数系で表したりします。
controllerはviewsのディレクトリ名と結びついています。defで定義するアクション名はviewsディレクトリ以下のファイル名と結びついています。

helpers

helperはviewの中で使い回しているコードをまとめて定義しておいて置く場所です。
Railsの設計思想にはDRY(Don't Repeat Your self) と呼ばれる考えがあり、
同じコードを複数書く場合は一つにまとめておいて、それを呼び出すだけにするなど、極力無駄を省いていこうという考え方があります。
それを実現するためにhelperは存在します

mailers

メール機能を実装するためのもの

models

modelsファイルをおいて置く場所です。
RailsにはActiveRecordと呼ばれるORマッパがあり、DBテーブルにmodelファイルが紐付きます。

views

viewファイルをおいて置く場所です。
erbではなく、slimやhamlなどがRails界隈では主流なように感じます


以上がデフォルトで生成されるディレクトリです。
これらのディレクトリがあればRailsでアプリケーションを作ることができます。
しかし、これらだけですとサービスの規模が大きくなっていくにつれて色々と問題が発生してきます。
modelの肥大化であったり、複数のテーブルにまたがってデータをInsertしなければいけなかったり、viewに渡すデータの整形など。
これらの問題を解決し開発がスムーズに行われるようにapp以下にディレクトリを追加します。

services

サービスディレクト
serviceクラスをおいて置く場所です。
serviceクラスの定義は様々ありますが、どのmodelにも紐付かない振る舞い、あるいは複数のエンティティに対する振る舞いをクラスとしてまとめて定義します。(例: 会員登録)
複数のエンティティに対する振る舞いをコールバックで実装してしまうとテストをするのが難しくなってしまったり変更に対して柔軟に対応するのがしづらくなっています。
なのでserviceクラスに責務を分けてしまもうということです。

forms

フォームディレクト
formクラスを置く場所です。
独自のformオブジェクトを生成するクラスを定義します。

decorators

decoratorファイルを置いておきます。
decoratorとはviewでデータの形を整形するためのメソッドをまとめて定義して置くことで簡単に呼出せて、viewが汚くなるのを防ぎます。
詳しくは、こちらに書いてあります。
RailsにはDraperと呼ばれるGemがあり簡単に実装できます。
詳しくは、こちらに書いてあります。

validators

validatorファイルを置いておきます。
データがDBにInsertされる前にデータが正しいかどうかを判断しするためにvalidationチェックをします。
そのvalidationを自分なりにカスタマイズして定義します。
詳しくは、http://qiita.com/n-oshiro/items/4a3188be66dd0e18bae5:titleこちら


これらを追加することで、より開発しやすくなるはずです・

・assets
・controllers
・decorators
・forms
・helpers
・mailers
・models
・services
・validators
・views