xxxcaqui.log

ツッコミお待ちしています

Rails4について自分が気になったところをまとめてみた。

今月のWebDBでRails4の特集があったので、個人的に気になるところをまとめてみる。

Rails4についての超まとめ

Rails4について一言でまとめると、こうです。

DHH「ぼくが かんがえた さいきょうの れいるず」

これから、

  • 追加されたもの
  • 変更されたもの
  • 削除されたもの

の3つの観点から特に気になったことをまとめてみます。

追加されたもの

concernsディレクトリ

複数のモデルやコントローラにまたがった処理を記述する場所として、app/models/concerns, app/controllers/concernsというディレクトリが新設されました。

このディレクトリに置かれたファイルはautoloadの対象となるため、requireなしでincludeできます。

定義されているroutesがブラウザから見れるように

rake routesの出力と同じものがhttp://localhost:3000/rails/info/routesで確認できるようになりました。

しかも、既に起動済みのRailsプロセスが使用されるため、rake routesより高速です。*1

whereメソッドにnotメソッドをチェーンできるように

今まで

users = name.nil? ? User.where("name IS NOT NULL")
                  : User.where("name <> ?", name)

と書かなければいけなかったところを、notメソッドにより

users = User.where.not(name: name)

と書けるようになりました。

これはかなりcool。

変更されたもの

自作スクリプトの置き場所がscriptからbinへ

Bundler1.3ではbinstubsという機能が提供されました。

binstubsとはgemから提供されるコマンドをBundler環境下で実行するためのものであり、そのためのwrapperをbinディレクトリに配置する必要があります。*2

このbinstubs対応のため、scriptディレクトリがbinディレクトリへと変更されました。

今後は自前のスクリプトもこのディレクトリに置くことになります。

testディレクトリ以下の構造変更

testディレクトリ以下のディレクトリ構造がmodels, controllersなどのテスト対象のディレクトリ名に変更されました。*3

開発者向けエラーページがリッチに

開発時にお世話になるエラーページが「今風に、きれいに見やすく」なったそうです。

これに関してはスクリーンショットなどが掲載されていなかったので、実際に試してみたいところ。

allメソッドがRelationを返すように

モデルのallメソッドはこれまでは配列を返していました。

しかし、ActiveRecord4におけるallメソッドは今までのscopedメソッドと同じ動きをします。*4

個人的にこれは嬉しい変更。kaminariとかに繋げるときにキレイに書ける気がする。

# 今まで
users = User.scoped.page(params[:page]).per(20)

としていた*5ところを

# これから
users = User.all.page(params[:page]).per(20)

と書けるはず。

名前付きスコープがlambda記法のみに

今まで

scope :administrators, where(admin: true)

と書いていたものを

scope :administrators, lambda{ where(admin: true) } # lambda記法
scope :administrators, -> { where(admin: true) }    # 矢印lambda

と書かなければならないように。

before_filterなどが改名

コントローラのアクション処理前に実行されるbefore_filterがbefore_actionに変更されました。*6

before_filterはアクション実行前に呼び出されるフックメソッドなので、実情に即した命名へと変更されたことになります。*7

なくなったもの

Ruby1.8以前のサポート

Rails4ではRuby1.8のサポートが打ち切られました。*8
Rails4を利用するためには、最低でも1.9.3以降を使用する必要があります。

ダイナミックファインダ

ダイナミックファインダとは、

user = User.find_all_by_name("Bob")

のようなメソッドのことですが、このダイナミックファインダがfind_by_xxx, find_by_xxx!を除いて全て廃止されました。

今後はクエリメソッド(whereメソッド)を用いて書く必要があります。

ActiveRecord::Observer

モデルにObserverパターンを簡単に実装するActiveRecord::Observerが「記法・APIがイマイチ」という理由により廃止されました。
*9

コントローラのrespond_toブロック

scaffoldで生成されるコントローラからrespond_toブロックが消えました。

jsonのリクエストに対してJbuilderを用いたテンプレートを使用します。*10

このテンプレートを用いたjsonのレスポンスを得るためには、http://example.com/users/1.jsonのようなURLを叩きます。

最後に

ここに書いたこと以外にも重要かつ様々な変更点*11が記事では取り扱われています。

また、リリースノートには記事に書いてあること以外にも多くのことが書かれているはずですので、興味がある方はそっちもあたってみると良いかと思います。

*1:とはいえ、ターミナルからrake routesで見てしまう気はします。

*2:binディレクトリにwrapperを置いておけば、bundle execと書かなくてもbundle execしたのと同様の効果が得られる

*3:RSpec風。

*4:scopedメソッドは廃止されました。

*5:実はscopedメソッドを知らなかったので、where "name like %"という最強にイケてない感じで書いてました。死にたい。

*6:記事には明記されていませんでしたが、当然after_filterも同じだと思います。

*7:ただ、新しいbefore_actionフックはフィルタ機能として使われることが多いと思うので、before_actionへのエイリアスという形でbefore_filterを残しても良かった気もします。

*8:個人的には1.9系を使ってるので何ら困らないのですが。

*9:近いうちに使ってみようと思っていただけに残念です。キレイに書けるようになって帰ってくると嬉しい。

*10:テンプレートファイルの拡張子は.json.jbuilder

*11:StrongParametersとかTurbolinksとか.rubyテンプレートとか