kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

Railsスタイルガイドななめ読み

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
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

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)

TODO