この記事はポーランドのソフトウェアエンジニア Andrzej Krzywda の Rails is not MVC の翻訳です。記事の内容は訳者の意見とは必ずしも同じではありません。
Rails は MVC ではない
Rails コミュニティーには用語の問題があります。
みんな Rails を MVC フレームワークだと宣伝しています。私もしたことがあります。しかし実のところ Rails は Model2 アーキテクチャです。MVC ではありません。
単に定義の問題ということは分かっています。どうでもいい話かもしれません。実際のところ最近まではそれほど問題ではありませんでした。最近 JavaScript MVC というトピックがよく話題になります。それは素晴らしいもので、ブラウザと JS の組み合わせは本当の MVC になり得そうです、Model2 ではなく。
OK じゃあ 違いは何なの?
端的にいうと、モデルが (Observer パターンを用いて) ビューに対して変更の通知ができる時、MVC と言います。それは、通常の Rails アプリではできないことです(WebSocket や Push 通知を使えば可能ですが、今の所そこまで一般的ではない)。MVC はむしろデスクトップの分野で一般的なアーキテクチャでした。
一方で Model2 は Rails で私たちがやっていることそのものです。私たちはモデルの変更をビューに通知したりしません。コントローラーは単純にモデルデータをビューに渡して、ブラウザに送る HTML の生成を行います。
最近発展してきている面白いパターンで、Rails を JSON/REST API を扱うアプリのバックエンドのとしてのみ使うというものがあります。Model2 に似ていますが、HTML を生成する代わりに、JSON を生成する点が異なります。それでもやはり MVC ではありません。
より詳しく知りたい場合はこちらの Martin Fowler の UI アーキテクチャに関する記事をお勧めします。
なぜ重要か?
これは問題になりつつあると思います。なぜなら私たちは JavaScript MVC についてよく話すようになってきているためです。JavaScript の MVC は本当の MVC です。モデルは簡単にビューに通知を送ることができます。しばしば、JS MVC を紹介された人たちが混乱して Model2 パターンをクライアントサイドで実装してしまっているのを見かけますが、私の目から見るとそれは滑稽です。
Model2 と MVC の混乱についてどうするか
選択肢として3つ
1つめは MVC はオリジナルの意味が変わったと考えて、Model2 も MVC と呼ぶこと。この場合、もともとの MVC を指して classic MVC とか real MVC などのように呼ぶことができると思います。これは実際今起き始めていることですが、しかし私の意見では定義を変えるのは良い考えとは思えません。それはさらなる混乱を招くでしょう。
2つめはあくまで Rails は Model2 アーキテクチャであると言い MVC は元々の MVC を指すとすることです。これは険しい道ですが、もともとの定義を維持できます。
3つめは単に無視すること。どうでもいいじゃない。
個人的には 2つめの道でいきたいと思っています。