こんにちは、鈴木です。
6/25 に Rails4 がリリースされましたが、周辺ライブラリは問題無く動作するのでしょうか。
いざ Rails4!! となった時に困らないために、良く利用するライブラリについて動作検証を行いました。
検証方法はとにかく動かす!
検証方法は「とにかく動かす!」です。
使いそうな機能を中心に、ひたすら動かします!
検証に使用した Ruby と Rails のバージョンは以下の通りです。
- Ruby 2.0.0-p247
- Ruby on Rails 4.0.0
調査結果
アプリケーションサーバ
まずはアプリケーションサーバです。
過去に使用したことのあるアプリケーションサーバを調査対象としました。
- [OK] unicorn 4.6.3
- [OK] thin 1.5.1
- [NG] mongrel 1.1.5
mongrel についはインストール時にコンパイルエラーが発生してしまいました。
Rails4 からはデフォルトでスレッドセーフになっているので、
マルチスレッドで動作する puma や rainbows! は別途検証してみようと思います。
N+1 問題の検出
次に N+1 問題を検出してくれる「bullet」です。
- [OK] bullet 4.6.0
特に問題無く動作しました。
今回の調査で bullet の最近の更新履歴を確認したのですが、
ホワイトリストで警告を出さないクラスを指定する機能が増えていました。
アプリケーション設定
アプリケーション設定に関しては、以下のライブラリを確認しました。
- [OK] settingslogic 2.0.9
- [OK] rails_config 0.3.3
どちらもアプリケーションの設定を YAML ファイルから読み込んでくれるライブラリです。
論理削除
論理削除をサポートするライブラリには acts_as_paranoid が有名かと思います。
Rails4 用に rails4_acts_as_paranoid という名前で作成されていました。
- [△] rails4_acts_as_paranoid 0.1.4
※2014/1/28追記:コメントで教えて頂いたのですが、生成される SQL が永遠に伸びていくという問題があるようです。誤解を招くといけないので、[OK] から [△] に変更しました。
モバイル対応
モバイル対応には jpmobile が有名ですね。
- [OK] jpmobile 4.0.0
実機での確認は行っていませんが、エミュレータでは問題無く動作していました。
認証
認証用のライブラリはいくつもあるのですが、device だけ確認しました。
- [OK] device 1.5.4
※device だけ確認したことに深い理由はありません。他のライブラリの検証のついでに確認できたためです。
SSL 対応
何度か利用したことのある ssl_requirement を確認しました。
- [OK] ssl_requirement 1.4.2
ページング
rails3 からページングと言えば kaminari かと思います。
- [OK] kaminari 0.14.1
kaminari の検証中に、口述する「abstract_class=true なモデルと scope に関する問題」に遭遇しました。
検索機能の拡張
Rails2 時代には searchlogic という検索機能を強化するライブラリがありました。
searchlogic 自体は Rails3 に対応せず、代わりに meta_search というライブラリが登場しました。
- [NG] meta_search 0.5.4
残念ながら正しく動作しませんでした。
具体的には、「form_for(@user)」というコードに対して「引数の数が異なる」というエラーが発生するようになってしまいました。
ファイルアップロード(添付ファイル)
ファイルアップロード(添付ファイル)機能をサポートするライブラリはいくつかありますが、
その中で一番使った回数が多かった paperclip を確認しました。
- [OK] paperclip
特に問題無く動作しました。
エラー通知
例外が発生したときにメール通知してくれる exception_notification というライブラリがあります。
- [OK] exception_notification 4.0.0
最新バージョンではクラスが ExceptionNotifier から ExceptionNotification::Rack に変更されていました。
オプションを設定するハッシュも一段階ネストされるようになりました。
1 2 3 4 5 |
# 以前のバージョン. config.middleware.use(ExceptionNotifier, { ... }) # 最新バージョン config.middleware.use(ExceptionNotification::Rack, :email => { ... }) |
管理機能
管理機能を生成してくれるライブラリはいくつかあります。
- [△] rails_admin 0.5.0
- [NG] typus 3.1.10
rails_admin については、一応動作します。
ただし、ライブラリ内で attr_accessible を使用しているため、別途 protected_attributes を導入する必要がありました。
typus については、ライブラリ内のルーティング定義内でエラーが発生しました。
後述する「ルーティング定義で match を使用するときは via が必須になった」ことが原因でした。
Validation エラー表示
Rails2 時代に存在した error_messages_for や error_message_on が使えるようになるライブラリ dynamic_form を確認しました。
- [OK] dynamic_form 1.1.4
特に問題ありませんでした。
本ブログ執筆陣作成のライブラリ
本ブログ執筆陣作成のライブラリも Rails4 で動作することを確認しています。
- [OK] const_enum 1.0.4 (ActiveRecord 定数拡張)
- [OK] easy_model 1.0.4 (DB 非依存モデルのサポート)
- [OK] sys_logger 1.0.0 (Syslog モジュールのラッパー)
- [OK] active_modurality 1.0.1 (モデルの継承機能支援)
- [OK] activerecord-blockwhere 1.0.3 (Arel の where 拡張 DSL)
いくつか改善したいライブラリもあるので、時間を見つけて対応したいと思っています。
遭遇した問題のメモ
ActiveSupport::TaggedLogging がクラスからモジュールに変更された
ActiveSupport::TaggedLogging がクラスからモジュールに変更されています。
そのため、ActiveSupport::TaggedLogging を継承するコードを Rails4 プロジェクトに持ってくるとエラーになってしまいますので注意が必要です。(注意というよりは ActiveSupport::TaggedLogging を include するようにコードを修正する必要があります)。
ルーティング定義で match を使用するときは via が必須になった
ルーティングの定義を行うときの match メソッドですが、HTTP メソッドを指定しないとエラーが発生するようになりました。
例えば以下のようなコードはエラーとなります。
1 |
match '/trivial' => 'trivial#index' |
やるべきことは、:via オプションで対応する HTTP メソッドを指定します。
1 |
match '/trivial' => 'trivial#index', :via => :get |
別の対応方法として、match ではなく get に置き換えても OK です。
1 |
get '/trivial' => 'trivial#index' |
abstract_class=true なモデルと scope に関する問題
以下の問題に遭遇しました。
abstract_class=true なモデルで定義された scope を派生クラスで使用すると、生成される SQL からテーブル名が欠落してエラーとなる(SQL のシンタックスエラーとなる)という問題です。
具体例を挙げます。
次のような abstract_class=true なモデルを作成し、その中に適当な scope を作成します。
1 2 3 4 5 6 7 |
class ModelBase < ActiveRecord::Base # abstract_class=true なモデルで適当な scope を定義する. self.abstract_class = true scope :trivial, -> { where('TRUE') } end |
そのモデルを継承します。
1 2 3 |
class User < ModelBase end |
継承したモデルで親クラス(ModlelBase)で定義された scope を呼び出すと、テーブル名が欠落した SQL が生成されてしまいます。
1 |
User.trivial.to_sql # => SELECT "".* FROM "" WHERE (TRUE) |
まとめ
今まで使ってきたライブラリが軒並み動かなかったらどうしよう・・・という不安を抱えながら検証を始めました。
検証を行ってみて、思ったほど動かなくなっているライブラリは多くはありませんでした。
Rails4 では動かないライブラリもいくつかありましたが、
原因にはいくつかパターンがあるという感じでした(詳細は「遭遇した問題」を参照ください。)
これらの問題は Rails3 で作成したプロジェクトを Rails4 に移行するときにも遭遇する可能性があるので注意したいと思います。
今回は今まで使ったことが多いライブラリを検証しました。
使ったことは無いものの気になっているライブラリについては機会を改めて検証したいと思います。
Comments
rails4_acts_as_paranoidにはメモリ関連のバグがあってSQLクエリーが永遠に伸びていくようです。
情報ありがとうございます。
ちょっと調べてみたのですが、この Pull リクエストで指摘している内容のことでしょうか。
https://github.com/joelteon/rails4_acts_as_paranoid/pull/2
取り込まれないまま Close していますね・・。本文に注釈を入れておきました。