Ruby on Rails(略してRails)は、 MITライセンスの下でRubyで書かれたサーバーサイドWebアプリケーションフレームワークです。Railsはモデル・ビュー・コントローラー(MVC)フレームワークであり、データベース、Webサービス、Webページのデフォルト構造を提供します。データ転送にはJSONやXMLなどのWeb標準、ユーザーインターフェースにはHTML、CSS、JavaScriptの使用を推奨し、容易にします。MVCに加えて、Railsは、設定より規約(CoC)、繰り返しを避ける(DRY)、アクティブレコードパターンなど、他のよく知られたソフトウェアエンジニアリングパターンとパラダイムの使用を重視しています。[ 4 ]
2005年に登場したRuby on Railsは、シームレスなデータベーステーブルの作成、マイグレーション、ビューのスキャフォールディングといった機能を通じて、Webアプリケーション開発に大きな影響を与え、迅速なアプリケーション開発を可能にしました。Ruby on Railsはその後も、 PythonのDjango、PerlのCatalyst、PHP のLaravel、CakePHP、Yii、GroovyのGrails、ElixirのPhoenix、ScalaのPlay、Node.jsのSails.jsなど、他の言語のWebフレームワークに影響を与え続けています。
Ruby on Railsを使用している有名なサイトには、Airbnb、Archive of Our Own、Crunchbase、Dribbble、[ 5 ] GitHub、[ 6 ] Twitch [ 7 ]およびShopifyなどがあります。
David Heinemeier Hansson は、Web アプリケーション会社37signalsでのプロジェクト管理ツールBasecampの開発から Ruby on Rails を抽出しました。[ 8 ] Hansson は 2004 年 7 月に Rails をオープンソースとして初めて公開しましたが、プロジェクトへのコミット権限は 2005 年 2 月まで共有しませんでした。2006 年 8 月、 Apple が2007 年 10 月にリリースされたMac OS X v10.5 "Leopard" [ 9 ]に Ruby on Rails を搭載すると発表したことで、このフレームワークは大きな節目を迎えました。
Rails バージョン 2.3 は 2009 年 3 月 15 日にリリースされ、テンプレート、エンジン、Rack、ネストされたモデル形式に主要な新機能が追加されました。テンプレートを使用すると、開発者はカスタムgemと構成を備えたスケルトン アプリケーションを生成できます。エンジンを使用すると、開発者はルート、ビュー パス、モデルを含むアプリケーション パーツを再利用できます。Rack Web サーバー インターフェースと Metal を使用すると、Action Controller を迂回する最適化されたコードを記述できます。[ 10 ]
2008 年 12 月 23 日、別の Web アプリケーション フレームワークであるMerbがリリースされ、Ruby on Rails は Merb プロジェクトと協力して「 Merb の最高のアイデア」を Rails 3 に取り入れ、両コミュニティ間の「不必要な重複」を解消すると発表した。[ 11 ] Merb は Rails 3.0 リリースの一部として Rails に統合された。[ 12 ] [ 13 ]
Rails 3.1は2011年8月31日にリリースされ、リバーシブルデータベースマイグレーション、アセットパイプライン、ストリーミング、デフォルトのJavaScriptライブラリとしてのjQuery 、そして新たにスタックに導入されたCoffeeScriptとSassが特徴となっている。 [ 14 ]
Rails 3.2 は、より高速な開発モードとルーティング エンジン (Journey エンジンとも呼ばれる)、自動クエリ説明、タグ付きロギングを備え、2012 年 1 月 20 日にリリースされました。[ 15 ] Rails 3.2.x は、Ruby 1.8.7 をサポートする最後のバージョンです。[ 16 ] Rails 3.2.12 は Ruby 2.0 をサポートしています。[ 17 ]
Rails 4.0は2013年6月25日にリリースされ、ロシアン・ドール・キャッシング、ターボリンク、ライブストリーミングが導入されたほか、アクティブ・リソース、アクティブ・レコード・オブザーバーなどのコンポーネントがgemとして分割され、オプションになった。[ 18 ]
Rails 4.1は2014年4月8日にリリースされ、Spring、Variants、Enums、Mailerプレビュー、secrets.ymlが導入されました。[ 19 ]
Rails 4.2は2014年12月19日にリリースされ、Active Job、非同期メール、Adequate Record、Web Console、外部キーが導入されました。[ 20 ]
Rails 5.0は2016年6月30日にリリースされ、Action Cable、APIモード、Turbolinks 5が導入されました。[ 21 ]
Rails 5.0.0.1は2016年8月10日にリリースされ、Rakeではなくrails CLIを独占的に使用し、Rubyバージョン2.2.2以降をサポートしています。
Rails 5.1 は 2017 年 4 月 27 日にリリースされ、JavaScript統合の変更 (Yarn を介した NPM からの JavaScript 依存関係の管理、Webpackを使用した JavaScript のオプションのコンパイル、jQuery に依存する代わりにバニラ JavaScript を使用するように Rails UJS を書き直す)、Capybaraを使用したシステム テスト、暗号化されたシークレット、パラメータ化されたメーラー、直接および解決されたルート、および form_tag/form_for ヘルパーを置き換える統一された form_with ヘルパーが導入されました。[ 22 ]
Rails 5.2は2018年4月9日にリリースされ、ActiveStorage、組み込みのRedisキャッシュストア、更新されたRails認証情報、アプリケーションのコンテンツセキュリティポリシーを構成できる新しいDSLなどの新機能が導入されました。[ 23 ]
Rails 5.2.2は2018年12月4日にリリースされ、多数のバグ修正といくつかのロジックの改善が導入されました。[ 24 ]
Rails 6.0は2019年8月16日にリリースされ、Webpackがデフォルトになり、メールボックスルーティング、デフォルトのオンラインリッチテキストエディタ、並列テスト、複数のデータベースのサポート、メーラールーティング、新しいオートローダーが追加されました。[ 25 ]
Rails 6.1 は 2020 年 12 月 9 日にリリースされ、データベースごとの接続切り替え、水平データベース シャーディング、すべての関連付けの即時ロード、単一テーブル継承の代替としての委譲型、関連付けの非同期削除、エラー オブジェクト、その他の改善とバグ修正が追加されました。[ 26 ]
Rails 7.0は2021年12月15日にリリースされ、デフォルトでJavaScript管理のためにNode.jsとWebpackをimport mapsに置き換え、TurbolinksをTurboとStimulusの組み合わせに置き換え、Active Recordに職場での暗号化を追加し、コード読み込みにZeitwerkのみを使用するなど、多くの変更が加えられました。[ 27 ]
Rails 7.1は2023年10月5日にリリースされ、アプリケーションのデプロイにKamalを使用したDockerfileのサポート、認証の改善、そしてBunのサポートが追加されました。[ 28 ]
Ruby on Rails 8.0.0 は 2024 年 11 月 8 日にリリースされました。このメジャー リリースでは、Rails 開発に根本的な変化が導入され、個々の開発者がPlatform-as-a-serviceを必要とせずにアプリケーションを独立してホストおよび管理できるようになりました。このアップデートは、単一の開発者がアプリケーションのデプロイと管理のあらゆる側面をシームレスに処理できるようにすることに重点を置いています。[ 29 ]
Ruby on Rails 8.1.0 は 2025 年 10 月 24 日にリリースされました。主な機能には、アクティブ ジョブ継続、構造化イベント レポート、ローカル CI、および Markdown レンダリングが含まれます。[ 30 ]
Ruby on Railsはリリースごとに大きく進化し、新しい技術の活用を模索し、インターネット上の新しい標準を採用しています。Ruby on Railsには非常に安定した機能もあれば、新しい技術に置き換えられる機能もあります。
モデル・ビュー・コントローラー(MVC)パターンは、アプリケーションプログラミングを整理するための基本的な構造である。
デフォルト設定では、 Ruby on Rails フレームワークのモデルは、データベースのテーブルと Ruby ファイルにマッピングされます。たとえば、Userモデルクラスは通常、app/models ディレクトリの 'user.rb' ファイルで定義され、データベースの 'users' テーブルにリンクされます。開発者はこの慣例を無視して、モデル、ファイル、データベーステーブルに異なる名前を選択することもできますが、これは一般的な慣習ではなく、「設定よりも規約」の哲学に従って通常は推奨されません。[ 49 ]
コントローラーは、Rails のサーバーサイド コンポーネントであり、Web サーバーからアプリケーションへの外部リクエストに応答し、レンダリングするビュー ファイルを決定します。コントローラーは、1 つ以上のモデルにクエリを実行して情報を取得し、ビューに渡す必要がある場合もあります。たとえば、航空券予約システムでは、フライト検索機能を実装するコントローラーは、個々のフライトを表すモデルにクエリを実行して検索条件に一致するフライトを見つける必要があり、空港や航空会社を表すモデルにもクエリを実行して関連する二次データを見つける必要がある場合があります。コントローラーは、フライト データの一部を対応するビューに渡すことがあります。ビューには、フライト データを使用してフライトごとに 1 行のテーブルを含む HTML ドキュメントを作成する静的 HTML とロジックが混在しています。コントローラーは、1 つ以上のアクションを提供できます。Ruby on Rails では、アクションは通常、特定の外部 Web ブラウザー リクエストに応答する方法を記述する基本単位です。また、コントローラー/アクションは、対応するルートがマッピングされている場合にのみ、外部 Web リクエストからアクセス可能であることに注意してください。Rails では、開発者は、作成、新規、編集、更新、破棄、表示、インデックスなどのアクションを含むRESTfulルートを使用することを推奨しています。受信リクエスト/ルートとコントローラーアクションのマッピングは、routes.rb設定ファイルで簡単に設定できます。
Railsのデフォルト設定におけるビューはERBファイルであり、実行時に評価されてHTMLに変換されます。あるいは、ビューには他の多くのテンプレートシステムを使用することも可能です。
Ruby on Railsには、基本的なWebサイトに必要なモデルやビューの一部を自動的に構築できるスキャフォールディングなど、一般的な開発タスクを「すぐに使える」ように簡単にするツールが含まれています。[ 50 ]また、Rubyに同梱されているシンプルなRuby WebサーバーであるWEBrickや、gemとして配布されているビルドシステムであるRakeも含まれています。これらのツールはRuby on Railsと合わせて、基本的な開発環境を提供します。
Ruby on Rails は、インターネットに直接接続されることはほとんどなく、フロントエンドのWeb サーバーを介して接続されます。初期の頃は WEBrick よりもMongrel が一般的に好まれていましたが、 Lighttpd、Apache、Cherokee、Hiawatha、Nginx (モジュール (例えばPhusion Passenger)として、またはCGI、FastCGI、mod ruby を介して)、その他多くのサーバーでも動作します。2008 年以降、Passenger が Mongrel に代わって Ruby on Rails で最もよく使用される Web サーバーとなりました。[ 51 ] Ruby はIBM iでネイティブにサポートされています。[ 52 ]
Ruby on Rails は、 Ajaxアクションのスクリプト作成にJavaScriptライブラリPrototypeとScript.aculo.usを多用している点でも注目に値します。 [ 53 ] Ruby on Rails 3.0 では、ページのマークアップ (ページの構造を定義する) とスクリプト (ページの機能やロジックを決定する) が分離されています。バージョン 7.0 以降、新しい Ruby on Rails アプリケーションには、デフォルトでHotwireファミリーの JavaScript ライブラリがインストールされています。
バージョン2.0以降、Ruby on RailsはHTMLとXMLの両方を標準出力フォーマットとして提供しています。後者はRESTful Webサービスのための機能です。
デフォルトでは、サーバーはHTMLビューで埋め込みRubyを使用し、ファイル拡張子はhtml.erbになります。Railsは、 HAMLやMustacheなどの代替テンプレート言語の切り替えをサポートしています。
Ruby on Rails 3.0 は Ruby 1.8.7、Ruby 1.9.2、およびJRuby 1.5.2以降で動作するように設計されており、それ以前のバージョンはサポートされていません。[ 54 ]
Ruby on Rails 3.2は、Ruby 1.8.7をサポートする最後のリリースシリーズです。
Ruby on Rails は、ActiveRecord (データベースアクセス用のオブジェクトリレーショナルマッピングシステム)、Action Pack、Active Support、Action Mailer など、さまざまなパッケージに分かれています。バージョン 2.0 より前は、Ruby on Rails には Action Web Service パッケージも含まれていましたが、現在は Active Resource に置き換えられています。標準パッケージとは別に、開発者は既存のパッケージを拡張するプラグインを作成できます。以前の Rails は独自のカスタムフレームワーク内でプラグインをサポートしていましたが、バージョン 3.2 では標準の Ruby 「gem」を優先して、これらのプラグインは非推奨になりました。[ 55 ]
Ruby on Rails は、現在のバージョンの Ruby に含まれているパッケージマネージャであるRubyGems [ 56 ]を使用してインストールされることが多い。多くの無料のUnix ライクなシステムも、ネイティブのパッケージ管理システムを介して Ruby on Rails とその依存関係のインストールをサポートしている。
Ruby on Railsは通常、 MySQLやPostgreSQLなどのデータベースサーバーと、 Phusion Passengerモジュールを実行するApacheなどのWebサーバーと共にデプロイされます。
Ruby on Railsは、設定よりも規約を重視する(CoC)ことと、繰り返しを避ける(DRY)原則を重視するように設計されています。
Rails Doctrineは、Ruby on Railsフレームワークの哲学、設計、実装を導く永続的な推進力です。 [ 49 ]
「規約優先の設定」とは、開発者はアプリケーションの非慣習的な側面のみを指定すればよいことを意味します。たとえば、モデルにSaleクラスがある場合、データベース内の対応するテーブルはデフォルトでsalesという名前になります。テーブル名を「products sold」など、この規約から逸脱した場合にのみ、開発者はこれらの名前に関するコードを記述する必要があります。一般的に、Ruby on Rails の規約は、コード量と繰り返しを減らすことにつながります。[ 57 ]
「繰り返しを避ける」とは、情報が単一の明確な場所に集約されていることを意味します。例えば、 RailsのActiveRecordモジュールを使用する場合、開発者はクラス定義でデータベースの列名を指定する必要がありません。代わりに、Ruby on Railsはクラス名に基づいてデータベースからこの情報を取得できます。
「太いモデル、細いコントローラー」とは、アプリケーションロジックの大部分をモデル内に配置しつつ、コントローラーはできるだけ軽量に保つべきだという意味です。
HTML Over The Wire (Hotwire) [ 58 ] [ 59 ] 、概念圧縮[ 60 ] [ 61 ]、堅牢なセキュリティ[ 62 ]は、Rails 7.0 の One Person Framework へのアプローチの特徴です。[ a ]
2007年3月、David Heinemeier Hanssonは、 Ruby on Rails関連の3つの 商標を米国特許商標庁(USPTO)に登録申請しました。これらの申請は、「RUBY ON RAILS」というフレーズ[ 64 ] 、 「RAILS」という単語[ 65 ]、および公式のRailsロゴ[ 66 ]に関するものです。 2007年の夏、Hanssonは、権威あるコミュニティメンバー数名が執筆した新しいRuby on Railsの書籍の表紙にRuby on Railsロゴを使用することを出版社Apressに許可しませんでした。この一件は、Ruby on Railsコミュニティで穏やかな抗議を引き起こしました[ 67 ] [ 68 ] 。この批判に対し、Hanssonは次のように回答しました。
私が直接関わっている製品、例えば私が開発プロセスに参加した書籍や、私が実行に関与しているカンファレンスなどに対してのみ、[Rails ロゴの]宣伝使用を許可します。私は間違いなく Rails のすべての商標権を行使しようとします。[ 67 ]
ロゴの商標は2019年10月25日に取り消されました。[ 66 ]
初期の頃、Matz の Ruby インタープリタ(事実上の Ruby のリファレンス インタープリタ) 上で動作する Rails は、スケーラビリティの問題で批判されていました。[ 69 ]これらの批判では、2007 年と 2008 年に発生したさまざまなTwitter の障害がよく言及され、これが Twitter がキューイング システムやその他のミドルウェアにScala ( Java 仮想マシン上で動作する)に部分的に移行するきっかけとなりました。[ 70 ] [ 71 ]サイトのユーザー インターフェイス部分は、パフォーマンスに関する懸念から 2011 年に置き換えられるまで、引き続き Ruby on Rails で動作していました。 [ 72 ] [ 73 ]一方、多くの Rails ビジネス アプリケーション開発者は、スケーラビリティの問題に対処するために、データベース エンジン、キャッシュ構成、サーバーの選択を含むシステム アーキテクチャ設計に依存していました。Rails のオリジナル 作者である David Heinemeier Hansson は、Twitter のスケーリングの問題は、Rails のせいではなく、Twitter 自身の不適切なアーキテクチャ決定の結果であると批判しました。ハンソンによれば、フレームワークに何の貢献もせずに自分たちの問題をRailsのせいにするのは恩知らずで不当である。[ 74 ]
2011年、Gartner Researchは、批判やJavaとの比較にもかかわらず、多くの著名な消費者向けWeb企業がスケーラブルなWebアプリケーションを構築するためにRuby on Railsを使用していると指摘した。Ruby on Railsを実行している最大規模のサイトには、Airbnb、Cookpad、GitHub、GitLab、[ 75 ] Scribd、Shopify、Basecampなどがある。[ 76 ] 2016年1月現在、120万以上のWebサイトがRuby on Railsを実行していると推定されている。[ 77 ] [ 78 ]
2012年3月、セキュリティ研究者のエゴール・ホマコフは、特定のRailsアプリケーションをリモートから悪用できる大量代入の脆弱性を発見し、以前に責任ある情報開示を試みたものの却下された後、 GitHubを悪意なくハッキングすることでそれを実証した。[ 79 ]
2013年9月24日、Ruby on Railsでセッションクッキーの永続性に関するセキュリティ上の脆弱性が報告されました。デフォルトの設定では、セッションハッシュ全体がCookieStoreと呼ばれるセッションクッキー内に保存されるため、セッションクッキーを持つ認証済みセッションは、将来いつでもターゲットユーザーとしてログインできてしまいます。回避策として、管理者はActiveRecordStoreなどのメカニズムを使用してクッキーをサーバーに保存するように設定することが推奨されています。[ 80 ]
研究者のダニエル・ジャクソンとジョセフ・ニアは、Railsプログラムのデータアクセスを分析し、プログラムがアクセス制限に関するルールに適切に準拠しているかどうかを判断できる「Space」と呼ばれるデータデバッガを開発しました。2016年4月15日、ニアはSpaceを使用して50の人気Webアプリケーションを分析した結果、これまで知られていなかった23のセキュリティ上の欠陥が発見されたと報告しました。[ 81 ]
{{cite web}}: CS1 maint: url-status (リンク){{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite web}}: CS1 maint: url-status (リンク)3.0は、Ruby 1.8.7、Ruby 1.9.2、およびJRuby 1.5.2+で動作するように設計されています。
さまざまな指標から見て、Twitterは現在インターネット上で最大のRailsサイトです。Rails上で動作しているため、スケーリングの問題(成長するサイトならいずれ直面する問題)に、他のフレームワークよりもはるかに早く対処せざるを得ませんでした。
フロントエンドとデーモン間の通信に使用していた Ruby ベースのキューイング システムがありましたが、最終的にそれを Scala で書かれたものに置き換えました。Ruby のものは、通常の安定状態では実際にはかなりうまく機能しましたが、起動時間とクラッシュ動作は望ましくありませんでした。
氏によると、Twitterは今年末までにミドルウェアのインフラストラクチャ全体とAPIを新しい言語に移植したいと考えている。Rubyは残るが、フロントエンドのみとなる。「ユーザー向けの機能を構築するには、Railsで十分満足しています。パフォーマンスの面では、ウェブページをクリックする程度であれば問題ありません。私たちが離れようとしているのは、重い処理や非同期処理の類です。」
ではScalaを一部使用していますが、サイトの大部分はRubyです。