blog.waterlow.work

Ruby, Rails, js, etc...

捗る!Ruby on Railsでscaffold駆動開発

最近Ruby on Railsの開発をするときに、色々参考にするためにscaffoldを叩くようにしています。 scaffoldのコードからどういうところが学べるのかを書いていきます。

scaffoldは誰もが通る道

きっとRailsを始める人は、Railsチュートリアルなり本なりで勉強することが多いはずです。scaffoldはそれらの中でRailsを始める第一歩として取り上げられることが多く、よってかなりの人がscaffoldのコードを目にしているはずです。

scaffoldから学べるポイント

コントローラで例外処理を書かない

scaffoldで作られるコントローラには、例外処理が一切ありません。しかし、ActiveRecord::RecordNotFoundになったら404が返るし、NoMethodErrorは500が返るわけです。これによりコントローラでの関心事を少なくすることができます。多くのアプリケーションでは404や500のエラーページを専用のものを用意しますが、以下のようなプラクティスで、例外処理を共通化することができます。

Railsの404,500エラーページをカスタマイズ - Qiita

update系の成功失敗は戻り値で判断

jnchitoさんが以下の記事に書いてくださっています。 qiita.com save, update, destroyはバリデーションエラーが発生する可能性があり、その場合はエラーページではなく正常なページでバリデーションで引っかかった箇所をユーザに通知するのが望ましいです。エラーをraiseして500エラーページを出してはいけません。

ルーティングはRESTに

特に必要がなれけばconfig/routes.rbにはresourcesでルーティングを定義するのが良いです。これにより全体のAPIインタフェースを合わせることができます。

namespaceありの場合の挙動

例えば以下のようなコマンドを打ったとしましょう

rails g scaffold foo/bar

すると、以下のようなモジュールが追加されます

module Foo
  def self.table_name_prefix
    'foo_'
  end
end

これにより、モジュール下のモデルにtable nameをいちいち書く必要がなくなります。 また、ルーティングもどのようにして書かなければならないかいつも覚えられないのですが、動作できるように追加してくれます。

だめなところもある

コントローラでbefore_action でついてくるset_xxxは実はもやもやしています。 scaffoldで書いてあるのくらいであればいいのですが、だんだん増えてコントローラのconcernで共通化やり出す発想になるのは避けたいところです。

www.slideshare.net

まとめ

scaffoldをを叩いたときに学べるポイントをメインに書いていきました。 もっとみんなscaffoldを使ってほしい!!!!