エンジニアステップ

初心者エンジニア(1年目~3年目くらい)のための技術ブログ

評判良い「Ruby on Rails チュートリアル」をRoR初心者が学習した感想と記録【Michael Hartl】

ruby on rails チュートリアルの感想まとめ

Ruby on Rails チュートリアル(実例を使ってRailsを学ぼう)というMichael Hartl (マイケル・ハートル)さんが書いた無料の教材があります。 

かなり評判が良い教材のようなので、試しに勉強してみました。

 

ちなみに学習する私(https://twitter.com/engineeraru)は

  • エンジニア歴5年ほど(スクリプト言語、WEB系サービスは未経験)
  • Ruby、RoRをProgateの教材で学んだ
  • 自力でWebサービスを作った経験はない
  • Railsで自作のウェブサービスを作りたい!

という感じです。

※WEB系を目指している「SIerのプログラマ」みたいなスペックです

 

当記事では、Railsチュートリアルを学んだ軌跡、感想をまとめていきます。

» 参考:私がRailsTutorialでつまずいた所もまとめました

 

第1章 ゼロからデプロイまで 【120m / ★★★★☆】

「Ruby on Rails チュートリアル 第1章 ゼロからデプロイまで」を勉強しました。

railstutorial.jp

  • 学習時間:120m
  • 難易度:★★★★☆ ※★が多いほど難しい

ハッキリ言って、想像の10倍くらい大変でしたw

 

AWS契約して、BitbucketとHerokuのユーザ登録して、SSH使って…という所からして面倒くさい!

コマンドラインの使い方とGitの使い方も理解必須ですので、初心者はProgateで勉強しておくべきですね。

いずれにせよ、エンジニア経験ない人が独学で学ぶには難しすぎる気がします(つまずいた時の解決方法がわからず挫折する)

 

とはいえ、もう作成したサービスをHerokuにデプロイして動くようになったのは感動。

本気で、「Webサービスを作りたい!!」という気合ある人には、役に立ちますね。

 

学習内容メモ

  • AWS Cloud9はクラウドIDEサービス。RubyやRubyGems、Gitなど、Railsの開発環境の構築に必要なソフトウェアがほとんど組み込まれている。
  • BitbucketはGitリポジトリのホスティングと共有に特化したサイト
  • GitHubは「リポジトリを一般公開する場合は無料、公開しない場合は有料」
  • Bitbucketは「共同作業者が一定数以下ならリポジトリを公開しなくても無料、共同作業者が一定数を超えると有料」
  • HerokuはRuby Webアプリ用のホスティングプラットフォーム。Gitを使っていれば、Railsアプリケーションを簡単に本番環境にデプロイできる

 

第2章 Toyアプリケーション 【36m / ★☆☆☆☆】

「Ruby on Rails チュートリアル 第2章 Toyアプリケーション」を勉強しました。

» 参考:Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

  • 学習時間:36m
  • 難易度:★☆☆☆☆ ※★が多いほど難しい

scaffoldを使って作られたアプリを見て、Railsアプリの基本的な作りを知る内容でした。

※ProgateでRailsを勉強した人なら、余裕なはず

 

学習内容メモ

  • scaffoldジェネレータ(スキャフォールド、足場という意味)を使えば中身はわからなくても簡単に作れる

  • データモデルとWebインターフェイスは、組み合わさってUsersリソースとなる。これはユーザーをHTTPプロトコル経由でCRUDできるオブジェクトである

  • ディスパッチとは「URLに基づき適切なコントローラのアクションに割り当てること」
  • RailsアプリにおけるRESTは、アプリケーションを構成するコンポーネント (ユーザーやマイクロポストなど) を「リソース」としてモデル化することを指す
  • @記号で始まる変数をRubyではインスタンス変数と呼び、Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになる

 

このMVCの図が分かりやすかったですね。

f:id:alpacajp:20190208172826p:plain

 

第3章 ほぼ静的なページの作成 【95m / ★★☆☆☆】

「Ruby on Rails チュートリアル 第3章 ほぼ静的なページの作成」を勉強しました。

https://railstutorial.jp/chapters/static_pages?version=5.1#cha-static_pages

  • 学習時間:95m
  • 難易度:★★☆☆☆ ※★が多いほど難しい

 

テストについての学習と、RailsのMVCの解説を細かくやってくれました(非常に優れたテキストだと思います)

章の内容とは別のところでエラーが何度もでて(サーバ起動とか)無駄に時間かかりました。

内容はそんなに難しくないと思います。

» 参考:【Rails Tutorial】エラー、失敗した所と対策まとめ - エンジニアステップ

 

学習内容メモ

  • コントローラとは (基本的に動的な) Webページの集合を束ねるコンテナのこと

  • railsの「server, console, generate」コマンドは省略可能。あと「bundle install」はbundleと省略可能。
  • コントローラ名をキャメルケースで渡すと、StaticPagesコントローラ名をスネークケースにしたファイルstatic_pages_controller.rbを自動的に生成する
  • routingファイルの「get 'static_pages/home'」はStaticPagesコントローラのhomeアクションと結びついている
  • rails destroyというコマンドを実行することで元に戻すことができる
  • DBを最初の状態に戻す時は「rails db:migrate VERSION=0」でOK。rollbackも使える
  • Controllerは、ApplicationControllerクラスを継承しているので、何も書いていなくても、そのアクションに対応するビューを出力する
  • Viewを作る時はコマンド touch app/views/static_pages/about.html.erb で空ファイルを作成する
  • assert_selectメソッドでは、特定のHTMLタグが存在するかどうかをテストする
  • csrf_meta_tagsは、Web攻撃手法の1つであるクロスサイトリクエストフォージェリー (Cross-Site Request Forgery: CSRF)を防ぐために使われる ※Railsのメソッド
  • Guardは、ファイルシステムの変更を監視するツール(自動的にテストを実行するのに役立つ)

 

第4章 Rails風味のRuby 【45m / ★★☆☆☆】

「Ruby on Rails チュートリアル 第4章 Rails風味のRuby」を勉強しました。

https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#cha-rails_flavored_ruby

  • 学習時間:45m
  • 難易度:★★☆☆☆ ※★が多いほど難しい

 

Railsのオブジェクトとかメソッドとかについての勉強。

手を動かすことはほとんど無く、ただ読んで終わった(それでも時間かかりますね)

 

学習内容メモ

  • 新しく作ったメソッドはカスタムヘルパー と呼ぶ

  • Railsコンソールはirb (IRB: Interactive RuBy) を拡張して作られているため、Rubyの機能をすべて使える
  • 文字列の中で変数を展開する方法は「式展開 (interpolation)」である。"#{変数}"で可能 ※シングルクォート文字列の時は式展開しない
  • 出力メソッド「puts」(put string)の返り値はnil、更に文の末尾に改行文字「\n」が追加される。printメソッドは末尾に改行文字を追加しない
  • Rubyではすべてのものがオブジェクト(文字列もnilも)
  • 後続するifでの条件式が真のときにだけ実行される式 (後続if)が使える
  • Rubyのメソッドには「暗黙の戻り値」がある(最後に評価された式の値)
  • モジュールは、関連メソッドをまとめるもの。includeメソッド(mixed in)で呼び出せる
  • ブロックを操作するには、{ |変数名| 処理 }を使うか、 do |変数名| 処理 end を使う
  • {}は空のハッシュ
  • シンボルは文字列と似ていますが、クォートで囲む代わりにコロンが前に置かれている点が異なる( "test" と :test は一緒)
  • ハッシュで使う「:name => "HOGE"」は「name:"HOGE"」と同じ意味
  • inspectメソッドはオブジェクトを表現する文字列を返す(pメソッドというショートカットもあり)
  • Rubyではメソッド呼び出し虹に丸括弧()はあってもなくても良い!
  • ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる(分かりづらい!!!)
  • Rubyでは組み込みの基本クラスの拡張が可能!
  • class定義で「attr_accessor :name, :email」などで、アクセサー(accessor)を作成するとデータを取り出すgetter,setterを定義してくれる。もちろんnameとemailもインスタンス変数となる
  • インスタンス変数は常に@記号で始まる。

 

第5章 レイアウトを作成する 【58m / ★★★☆☆】

「Ruby on Rails チュートリアル 第5章 レイアウトを作成する」を勉強しました。

https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#cha-filling_in_the_layout

  • 学習時間:58m
  • 難易度:★★★☆☆ ※★が多いほど難しい

 

内容は面白いんですが、情報量が多い!!!

手をあまり動かさないのもあって、本当に理解できているのか不安なまま進みます。

 

学習内容メモ

  • IE9より低いバージョンの時に、HTML5shimを読み込む方法→ <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
    </script>
    <![endif]-->

  • Railsはassetsディレクトリ直下の画像をapp/assets/imagesディレクトリにある画像と紐付けているので、ブラウザから見ると全て同じディレクトリにあるように見える
  • アンダースコアは、パーシャルで使う普遍的な命名規約であり、また、一目見ただけでディレクトリ中のすべてのパーシャルを識別することが可能になる
  • アセットに関しては、アセットパイプライン、マニフェストファイル、プリプロセッサエンジンの3つが重要!
  • Railsのアセットパイプラインでは、静的ファイルを目的別に分類する、標準的な3つのディレクトリが使われる↓
  • app/assets: 現在のアプリケーション固有のアセット
  • lib/assets: あなたの開発チームによって作成されたライブラリ用のアセット
  • vendor/assets: サードパーティのアセット
  • アセットを上記の3つの場所に配置した上で、マニフェストファイルでRailsにどのように1つのファイルにまとめるか指示する(Sprocketsというgemが行う)
  • プリプロセッサエンジンは、アセットを実行するもの
  • 名前付きルート「about_path」はURL「/about」と対応している
  • 結合テストを作る(rails generate integration_test site_layout)

 

第6章 ユーザーのモデルを作成する 【65m / ★★★☆☆】

「Ruby on Rails チュートリアル 第6章 ユーザーのモデルを作成する」を勉強しました。

https://railstutorial.jp/chapters/modeling_users?version=5.1#cha-modeling_users

  • 学習時間:65m
  • 難易度:★★★☆☆ ※★が多いほど難しい

 

Progateで学んでおいたおかげで何とかついていけてます。

Progateよりももう少し細かい仕組みのところがわかりますね。

 

学習内容メモ

  • データベースとやりとりをするRailsライブラリはActive Record
  • Active Recordのコールバック (callback) メソッドは、ある特定の時点で呼び出されるメソッド
  • Railsは、データベースの細部をほぼ完全に隠蔽し、切り離せる
  • 【慣習】コントローラ名には複数形を使い、モデル名には単数形を用いる
  • 【慣習】モデル名は単数形 (User) 、テーブル名は複数形 (users) 
  • 【慣習】大文字で始まる名前はRubyでは定数を意味
  • マジックカラム (Magic Columns):created_atとupdated_at
  • rails console --sandbox(サンドボックス)で起動すると、DB書き込みせずにテストできる
  • update_attributesメソッドは属性のハッシュを受け取り、成功時には更新と保存を続けて同時に行う
  • 【テスト】setupメソッド内に書かれた処理は、各テストが走る直前に実行
  • 【テスト】presence: trueという引数は、要素が1つのオプションハッシュ
  • 【テスト】assert_notメソッドは「偽なら成功」
  • 【メールのバリデーション】VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  • 【メールのバリデーション】uniquness: trueのままだと、大文字小文字を区別するので、uniqueness: { case_sensitive: false }と書く ※テストコードは片方だけuppercaseで大文字にする
  • 【パスワードのハッシュ化】has_secure_passwordを使ってパスワードをハッシュ化する。ハッシュ関数であるbcryptが必要でgemで追加
  • 【パスワードのハッシュ化】ハッシュ化されたパスワードを使うのに「password_digest」を設定。digestという言葉は、暗号化用ハッシュ関数という用語が語源
  • 【パスワードのハッシュ化】has_secure_passwordメソッドは存在性のバリデーションもするが、新しくレコードが追加されたときだけに適用される
  • 【マイグレーション名】to_usersにするとusersテーブルにカラムを追加するマイグレーションがRailsによって自動的に作成される
  • 【Herokuで実行】heroku run rails db:migrateでheroku環境でもDBをマイグレーションする

 

第7章 ユーザー登録【70m / ★★★★☆】

「Ruby on Rails チュートリアル 第7章 ユーザー登録」を勉強しました。

https://railstutorial.jp/chapters/sign_up?version=5.1#cha-sign_up

  • 学習時間:70m
  • 難易度:★★★★☆ ※★が多いほど難しい

やや難易度が上がった感じします。

というか、実践的な内容が増えてきた感じ。

特につまずくところはありませんが、分量が多いです。

 

学習内容メモ

  • 【デバッグ方法】application.html.erbに <%= debug(params) if Rails.env.development? %> を入れる
  • 【Railsの環境は3つ】テスト環境 (test)、開発環境 (development)、本番環境 (production) 
  • 【ルーティングの省略】resources :usersと書くことで、アクション/名前付きルートを自動で生成。RESTfulなリソースになる(index, show, new, create, edit, update, destroy)
  • 【デバッグ方法 byebug】byebugというgemを入れて、コードにdebuggerを書くとコンソールでブレイクポイントをアレコレできる(Ctrl+Dで抜け出す)
  • 【Gravatar (Globally Recognized AVATAR) 】無料のWEBサービス。メールアドレスと画像を紐づけ出来る(画像の置き場所の悩みはない)
  • 【再利用したいメソッド】ヘルパーファイルで定義されているメソッドは自動的にすべてのビューで利用可能
  • redirect_to @userは、redirect_to user_url(@user)と同一
  • 【テスト】assert_differenceでは第一引数に文字列を渡して、第二引数に差分を渡す
  • SSLを有効化するには、production.rbという本番環境の設定ファイルの1行を修正すればOK(SSLを強制できる)
  • 【本番】HerokuのデフォルトのWebサーバ「WEBrick」は本番には適してない。Pumaだと多数のトラフィックを扱える

 

第8章 基本的なログイン機構【39m / ★★☆☆☆】

「Ruby on Rails チュートリアル 第8章 基本的なログイン機構」を勉強しました。

https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login

  • 学習時間:39m
  • 難易度:★★☆☆☆ ※★が多いほど難しい

セッションの仕組みさえ理解できていれば簡単です。

 

学習内容メモ

  • 【認証システム (Authentification System)】ブラウザがログインしている状態を保持し、ユーザーによってブラウザが閉じられたら状態を破棄する仕組み
  • 制限や制御の仕組みを認可モデル (Authorization Model)と呼ぶ
  • 一時セッションはRailsのsessionメソッドで実現できる
  • flash.nowは、レンダリングが終わっているページで特別にフラッシュメッセージを表示することができる(その後リクエスト発生したら消える)
  • 【セッション】session[:user_id] = user.idで、ユーザーのブラウザ内の一時cookiesに暗号化済みのユーザーIDが自動作成 ※一時クッキーと永続的クッキーは別物
  • 【セッション】sessionメソッドで作成された一時cookiesは、ブラウザを閉じた瞬間に有効期限が終了
  • 【テスト】fixtureにサンプルデータを入れる ※テスト用のfixtureでは全員同じパスワード「password」を使うことが多い(生のパスワードを参照するのができないので)

 

第9章 発展的なログイン機構【39m / ★★☆☆☆】

「Ruby on Rails チュートリアル 第9章 発展的なログイン機構」を勉強しました。

https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login

  • 学習時間:39m
  • 難易度:★★☆☆☆ ※★が多いほど難しい

セッションの仕組みさえ理解できていれば簡単です。

 

学習内容メモ

  • 【記憶トークン (remember token)】長くてランダムならOK。各ユーザで同一のトークンでもOK
  • 記憶ダイジェスト (remember digest)
  • 【1】記憶トークンはランダムな文字列
  • 【2】ブラウザのcookiesには、有効期限あるトークンを保存
  • 【3】DBには、ハッシュ値になったトークンを保存
  • 【4】ブラウザのcookiesには、暗号化したユーザーIDを保存
  • 【5】永続ユーザーIDを含むcookiesを受け取る→ユーザIDを使いDBからハッシュ値を取得→記憶トークンのcookiesとDBのハッシュ値を比較する
  • 9.1.2~~ (9m)

 

~~~~

どんどん書いていきます。

ちなみに分量としては、

>3日間で読破できる人は例外です! 実際には数週間〜数ヶ月をかけて読むのが一般的です。

と書いてます。

とりあえず初日は1~5章まで終わらせました。

3日で出来るかチャレンジしてみようと思います。