ruby読んだついでにこっちも読んどく
Routing
RESTfulなresourceにアクションを追加する場合、member と collection を利用する
#config/routes.rb resources :subscriptions do get 'unsubscribe', on: :member end resources :photos do get 'search', on: :collection end resources :subscriptions do # 複数ある場合 member do get 'unsubscribe' # more routes end end
- member: id付きのルート
- collection: idなしのルート
resourcesの入れ子で、ActiveRecordのモデル間の関連を表現できる
resources :posts do #Post has meny Comments resources :comments end
- commentsのidが一意の場合、shallowを使うとURLを短縮できる
resources :posts, shallow: true do resources :comments end
match を利用しない
- 利用する場合、アクション毎に :via オプションで[:get, :post, :patch, :put, :delete]を指定する
Controllers
- ビジネスロジックは、modelに書く
- controller の役割は、view層にデータを渡すこと、またはview層からデータを受け取ることのいずれかのみ
- (理想論ですが)すべての controller は find と new 以外のメソッドはひとつ程度に
- controller と view の間でやりとりするインスタンス変数は2つまで
Models
- ActiveRecord を継承しないモデルも導入する
- Sexy Validationを利用する
- 独自のヴァリデーションが2回以上呼び出される場合、もしくは独自のヴァリデーションが正規表現を含む場合は、ファイルとして切り出す
- 独自のヴァリデーション・ファイルはapp/validatorsを作成し、その配下に配置
- 名前付きスコープがラムダ式で定義されており、かつ引数が複雑になってきた際には、スコープ名と同名のActiveRecord::Relationオブジェクトを返すクラスメソッドを作成する
class User < ActiveRecord::Base def self.with_orders joins(:orders).select('distinct(users.id)') end end
- ActiveRecordのオブジェクトに対して繰り返し処理を行う場合は、find_each
- all だと、全てのデータをDBから取り出してメモリに突っ込むので危険
Migrations
- フィールドの初期値の設定処理は、アプリケーションの中に記述せず、migration ファイルに記述する
- 外部キー制約を設定しよう
- Rails 4.2 からは設定可能だよ!!
- Rails4 - Rails 4.2 で MySQL の外部キー制約の作成と削除 - Qiita
Assets
- 可能ならば、gem化されたAssetsを使う
Bundler
- 有名で利用者の多い gem を利用する
- OS固有のgemは、グルーピングしよう
# Gemfile group :darwin do gem 'rb-fsevent' gem 'growl' end group :linux do gem 'rb-inotify' end
config/application.rb に以下を追記して、環境変数RUBY_PLATFORM
で使用するgemを決定する
#config/application.rb platform = RUBY_PLATFORM.match(/(linux|darwin)/)[0].to_sym Bundler.require(platform)