Ruby on Railsによるプログラミングに関する世界観です。
最近、Webフレームワークというものが、IT業界でWebサービスを開発するために大いに流行している。
Webフレームワークとはなんなのか。それは、「Webサービスを簡単に作ることのできるフレームワーク」のことだ。
そして、このWebフレームワークの火付け役となったような存在が、MVCフレームワークのRuby on Railsである。
Railsを使うことで、HTMLのビューを画面インターフェースとし(V: ビュー)、SQLのデータベースをデータの永続化手段とし(M: モデル)、プログラミング言語Rubyでロジックを記述することで(C: コントローラ)、とても洗練された設計と管理のやり方で、簡単にWebサービスを作ることができる。
Railsによって具体的にどんなことができるか。たとえば、TwitterやFacebookのような、ミニブログやSNSをはじめとする、Web上の交流スペースが作れる。ほかにも、ブログサービスとか、CMSとかのように、Web上でSQLデータベースとHTMLを使って作ることができるものが簡単に作れる。
Railsにおける大きな特徴は、従来難しいとされていたことを簡単かつスマートにできるということ。データベースのCRUD操作などは簡単に自動作成できるし、RESTfulやJSONやAjaxなどにも簡単に対応できる。
Railsは、MVCフレームワークという考え方と規約に基づき、「少ない記述量でWebアプリケーションを可能にする」ことを目指したWebアプリケーション・フレームワークだ。
MはModelで、データベース管理システムのテーブルを表している。
VはViewで、データをどのように表示するかを表している。HTMLに若干のコードを加えることで実現される。
CはControllerで、プログラミングとしての、Webブラウザによって呼び出される、個々のリクエストに応じたアプリケーションのメソッドや処理を表し、ModelとViewを統括している。
Railsの基本理念は「同じことを繰り返さない」ことと「設定より規約」であり、一度書いたコードなどを再度、重複して書く必要はなく、また複雑な設定を編集するのではなく、ある一定の慎重に設計された決まりごと(規約)に則したシステムの構築を行うことによって、設定を無くすことができる。
Railsのコード量の少なさは画期的で、またその管理のしやすさとシステムの作りやすさは革命的だった。まるで、機関車が線路(レール)の上を走っているかのように、規約通りにすればとても簡単にWebアプリケーションを構築出来る。
また、Railsをやると、プログラミングの基本とは何なのか、ということが良く分かる。どこでもRailsはプログラミングの入門や基礎のために良いと言われる。だが、逆に「簡単すぎて技術力の習得にならない」と、Railsを敬遠する意見も一部にはある。
まず、Railsにはモデル、ビュー、コントローラという3つの層がある。
モデルはデータベースのことで、SQLiteなどで作ったデータベーステーブルに対して、決められた命名規則で自動的にデータベースを操作するためのクラスが定義される。
このモデルを用いて、データベースを操作する。SQL文を用いずにRubyでデータを操作する「マイグレーション」を行う。
ビューは、HTMLの表示部分。ERBを使ってHTMLの中にRuby構文を埋め込む。<% ~ %>とした部分にRuby文を入れられる。また、<%= ~ %>とすればRuby文の中で最後に評価された値を表示できる。CSSはよりプログラマブルな計算などができるCSSであるScssを用いる。JavaScriptはRubyライクな記述でJavaScriptを記述できるCoffeeScriptを使う。ビューはアクションから呼ばれるが、命名規則に決められた通りすれば、何も記述しなくても自動的に特定のビューを表示できる。また、パーシャルを使ってビューの中の特定の部分を共有できる。たとえばブログの表示画面と編集画面で同じHTMLを表示することができる。
コントローラは、ビューとモデルを取り持つ部分。Rubyのインスタンス変数(@articleなど)を用いることで、コントローラ・ビュー・モデルの間で同じデータを共有・操作することができる。コントローラにはアクションを定義し、このアクションからビューが表示される。コントローラは既にあるクラスを継承し、アクションを定義することで開発を行う。また、URLからコントローラのアクションを呼ぶために最初にルーティングを行う。コントローラをプログラマが、ビューをデザイナーが担当することで、プログラマとデザイナーの間で仕事を分業しやすくなる。
Railsのジェネレータ機能であるScaffoldを使うことで、Webアプリケーションのひな形を自動作成できる。たとえばブログなどはほとんど自動作成してくれる。あとはデザイナーがCSSの修正や英語を日本語に直すだけで、簡単な日記システムなどはほとんど自動作成できる。
RailsではPumaと呼ばれるWebサーバーが付属している。またデータベース管理システムとしては、軽量なSQLiteが入門者にはおすすめな一方、MySQLやPostgreSQLも使うことができる。
詳しくはたった1日で基本が身に付く! Ruby on Rails 超入門が参考になります。
Railsは「設定より規約」という主義に基づいてWebアプリケーションの開発を行う。これはMVCフレームワークに従うということだけではなく、たとえばディレクトリやファイル名の命名規則(英単語の単数形と複数形を使い分けるなど)にも見られる傾向で、多くのことを規約に従って用意する。コントローラの機能はクラスを継承して実装し、ビューはスケルトンとして自動作成された(HTMLファイルに当たる)ERBファイルにRubyコードを埋め込んで実装する。また、データベースは専用の簡略化されたコマンドで、必要最低限のコマンドからSQLテーブルを作成し、それに対応するモデルを実装する。
規約通り進めていけば、驚くほど簡単にWebプログラミングが出来るが、規約以外のことをやるための自由度は少ない。
(昔少しだけ触ったRailsのチュートリアルの曖昧な知識で書いているため、間違ったことを言っているかもしれません。実際のところを知るためには、実際にRailsを触ってもらいたいと思います。)
Railsの開発は、ソースコードやプログラム例を提示して「このように書け」というものではなく、さまざまな手順を最小限行っていく「ワークフロー」です。
なので、簡単に開発の手順を提示することは出来ません。ですが、決して難しくはなく、以下のようなサイトをきちんと読んで「自分で実行」すれば、簡単に分かります。
おすすめなのはRails をはじめようです。rails generateコマンドを使って自動的にファイルやフォルダを作成したり、*.html.erbファイルにRubyコードを埋め込んだり、ApplicationControllerやApplicationRecordなどの基本クラスを継承したり、@articles.each doで繰り返し表示したりしながら、モデル、ビュー、コントローラ、そしてルーティングやアクションなどを作成していくことで、Webアプリケーションとは何であるか、ということが掴めます。
Rails環境の構築は、Docker Hubを使ってdocker runで入れるのが楽。
$ docker pull hoge $ docker run -it hoge /bin/bash
Railsのイメージを使うなら、以上のhogeの部分を「rails」に置き換えて実行すればよい。
NginxもMySQLも全部Dockerでコンテナとして起動してしまおう。注意点は、MySQLコンテナを削除するとデータも消えること。MySQLコンテナとデータコンテナを分けてデータの永続化を行う必要がある。詳しくは以下を参照のこと。
後日注記:複数のDockerイメージを連携させて動かす場合(たとえばRailsとMySQL)は、docker-composeというコマンドを使うと複数のイメージを楽に連携・管理できる。
Dockerも参照のこと。
以下の内容は、Ruby On Rails入門|90分でマスター!RubyOnRailsチュートリアル入門(せお丸のプログラマー養成講座) - YouTubeという動画を見た上で、自分なりに簡単な入門を書いてみました。詳しくは動画をご覧ください。
モデルはApplicationRecordを継承する。ApplicationRecordはActiveRecord::Baseを親クラスとして継承している。
RailsのActive Recordでは、SQL文を使わず、Ruby風のcreate, find, whereなどのメソッドを、rails cで実行されるRubyの入力プロンプトで実行する。saveでデータベースへの変更を適用できる。rails cでこれらの入力を行うと、発行されたSQL文を即座に確認できる。
Railsのマイグレーションファイルでは、日付を記録し、一度実行されたマイグレーションファイルは二度は実行されない。マイグレーションファイルでは、オートインクリメントされるidカラムやタイムスタンプ情報などを自動で付加できるほか、インデックスの有無やバリデーションルール(値を入れる時のルール、文字列で256文字以下など)も自動で付加するように記述できる。また、has_many(たくさんの子供を持つ)やbelongs_to(ひとつに属する)を使うことで、1対多のリレーションを表現できる。たくさんのコメントがつく掲示板やブログなどに必要となる。
データベースをデフォルトのSQLiteからMySQLなどに変更する時はYAMLファイル(database.yml)から設定を変更する。
データベースを参照のこと。
ルーティングは、基本的にgetやpostなどのHTTPリクエストと一緒にパス名を記述し、to: の後にコントローラのアクション名を記述する。
設定されているルーティング情報は、rails routesコマンドから確認できる。
また、簡単なCRUD操作は、Scaffold一発で自動作成できる。この時、HTTPには存在しないRESTfulなメソッドも自動で作成される。また、ルーティングにresourcesを記述すると、CRUDに対するルーティングを自動設定できる。
RESTを参照のこと。
コントローラはApplicationControllerを継承する。コントローラでは、HTTPリクエストとレスポンスを振り分ける。
コントローラの中のアクションからモデルとビューを使うことにより、ページごとの機能を実装する。
コントローラとビューをやり取りする時は、共有する変数名に@をつけてインスタンス変数にする。@のついたインスタンス変数は、コントローラとビューの間で共有できる。
また、ルーティングでリクエストパラメータを受け取る時は、/hoge/:uidなどのように:をつけ、その変数をparams[:uid]のように受け取る。
ビューはERBファイル(RubyコードをPHPのように埋め込んだHTMLファイル)を使って記述する。
基本的に、ルーティング情報から振り分けられるコントローラのアクションに対して、ビューを対応付ける。基本的には規約通りにすれば継承したりメソッドの名前を書いたりするだけで簡単に対応付けできる。もちろん開発とともにコントローラの中でアクションを書く必要は出てくる。
ビューは基本的にHTMLと同様だが、RubyコードとRailsのフォームヘルパーを中に埋め込める。@で始まるインスタンス変数により、コントローラの変数をビューで使用できる。
ビューを記述する上で必要なのは、Railsのフォームヘルパー(ビューヘルパー)という機能。フォームの部品やリンクなどは、フォームヘルパーを使って、HTMLで直接書くよりも柔軟で簡単な書き方で記述できる。フォームヘルパーで書いたフォームやリンクはそのままHTMLに変換される。また、部分テンプレートであるパーシャルを使うことで、よく使うHTML部品は複数のファイルで共有できる。パーシャルにはファイル名の先頭に_をつけることになっている。
HTMLを参照のこと。
Railsで開発をするために、全ての機能を自分で作る必要はない。多くの機能が、「Gem」というパッケージとして公開されており、Gemを使うだけでさまざまな機能を使うことができる。
Gemを使うにはRailsプロジェクトの中にあるGemfileを編集し、bundlerでインストールすればよい。
Gemsを参照のこと。
Railsのチュートリアル。
おすすめなのはRails Girlsのチュートリアルです。余計な情報がなく簡素で、簡単にRailsをはじめられます。
Railsのガイド。
Railsの参考文書。
まず、Web技術についてはほぼ公式とされるMDNを参照する。
次にRails Girlsや以下のRails Textbookが一部で有名かつおすすめ。僕も学びたい。
書籍としては以下のような書籍(現場Rails)があり、おすすめ。
もっときちんとした「参考文書ガイド」を読みたいならるびまにあります。
Rails GirlsはRailsのチュートリアルやTipsがたくさんあって参考になります。
特に、「この機能をつけるためにはどうすれば良いのだろう」と思った時に、さっとそのページを見ることができて、とても良いサイト構成をしていると思います。
Rails Girlsに、HerokuやOpenShiftにRailsアプリを公開する手順が書いてあります。
Herokuも参照のこと。
renderは、コントローラやビューの中から、RHTMLで書かれたビューや部分テンプレートを呼び出すメソッド。コントローラの中のアクションの中で、@hogeのように@をつけて作ったインスタンス変数は、ビューから使用できる。
redirect_toは、サーバにHTTPリクエストを送った上で、返ってくるHTMLが表示される。
以下の記事を参考に執筆しました。
RailsのルータはURLを受け取ってコントローラの中のアクションに処理を割り振る。
Active Recordは、MVCでいうところのM、モデルに相当する。O/Rマッピングの「Active Recordパターン」を実装したもの。
以下の記事を参考に執筆しました。
永続化とO/Rマッピングも参照のこと。
Action Controllerは、MVCでいうところのC、コントローラに相当する。
Action Viewは、MVCでいうところのV、ビューに相当する。ビューはERB(Embedded Ruby)というRuby埋め込み型のHTML形式で記述される。
Railsでは、:remote => trueでturbolinkを有効にすることで、Ajaxを自動的に有効にできる。あるいは、jQueryを使ってもAjaxを実装することができる。
Railsはデータがポストされた時、turbolinkが有効になっていると、HTMLファイルではなくJavaScript/JSON/XMLなどの形式のファイルをデータとして返し、自動でそのファイルを見つけて実行するようになっている。
詳しくは以下の記事が詳しい。
Ajaxも参照のこと。
Ruby on Railsの開発ツールとして、ジェットブレインズ社のRubyMineがあります。
たとえば、Railsではrailsコマンドを多用しますが、RubyMineを使うことで、コンソールから簡単にrailsコマンドを実行することができて、便利です。
また、RubyMineにはctagsと同様関数名から関数定義にジャンプする機能があり、クラスやメソッドの由来となる記述にジャンプすることができて、とても便利です。
IntellJ IDEAも参照のこと。
僕は、Railsが一部の人間に嫌われている理由は、コマンドでファイルを自動作成し、ほとんどコードを書かず、設定もせずに出来上がるそのRailsの手法が、コマンドと設定を主にするLinuxやRubyの文化の逆を行っているからだと思う。
Railsはコマンドを多用し、ファイルを自動作成する。そのファイルが何であるのか、説明をせず、何もせずに必要な全てのファイルが出来上がり、設定はせずにルールを守り、コードは最低限しか書かない。
まるで、Microsoft Visual C++のスケルトン作成を見ているようである。
Railsがここまで流行っている理由は、「Railsをやっていると、プログラミングの基本が全部分かってしまう」ということがある。Railsをやるだけで、簡単にコードをどのような場面で、どのように書けば良いのかが分かる。本当は、エンジニアの中にある「これがコードを書く秘訣だ」ということが、全部ばれて公になってしまうのだ。
だから、Railsは嫌われるが、僕は自信を持ってRailsを薦める。プログラミングをやりたいなら、RailsでWebサービス・Webアプリケーションを作るのが一番早道だ。おそらく、一週間でプログラマになれるだろう。
後日注記:プログラミングをするコツは、自分で作ること。そして、Railsを使ってWebサービスを作ると、「あれ、プログラミングできちゃった」という具合で、一番早道でプログラミングができる。なので、プログラマになりたい人はRailsをやるのが一番良い。おすすめである。
むしろ、Railsは嫌われているというよりも、むしろ、賢すぎて、一般的プログラマにはついていくことができないところがあります。
コマンド一発でなんでも可能であり、自動的なスケルトンコードの作成をふんだんに使い、設定はごく最低限で、すべてがよく考えられて設計されており、「そこまでやるか」というところまでやってくれるのが、Railsの特徴です。
正直言って、今までのPHPでSQLデータを繰り返し表示していたプログラマにとっては、ありえないです。賢すぎます。Railsの開発者は、まったく一般人とは別の頭をしているのだと思います。
Railsは、最近はもう古くなってきています。
最近のWebフレームワークは、RailsからNext.jsなどに取って代わられようとしています。
Railsは確かに優れたフレームワークでしたが、フロントエンド部分に課題があり、その結果最近ではRailsの代わりにNext.jsを使うことが多くなってきています。
特に、Rubyが動的型付け言語であるため、楽ではあるものの大規模な開発では逆に困難さを抱えてしまい、その点、TypeScriptなどは静的型付け言語であるため、大規模な開発に向いています。
最近、RailsをWebサービスの開発に使うことは少なくなりつつあります。新しい案件なら、Next.jsを使うことをおすすめします。
Webフレームワークを参照のこと。
書籍