はじめに
プログラミング歴11ヶ月の私が、Railsチュートリアル(第4版)を6日間で完走した感想です。
1周では理解できない部分が多々あったので(特に9章以降)、2周目をやる前にまとめようと思い、備忘録を書きます。
ちなみに、Railsチュートリアルをやる前の私の状態は、下記の通りとなっています。
- Progateで、Command Line / Git / HTML / CSS / Sass / JS / JS(ES5) / jQuery / Node.js / SQL / Ruby / Ruby on Rails5 を1周〜2周。
(総演習クリア数992 / 修了レッスン数53 / Lv.296)
- プログラミングスクールで、HTML / CSS / Ruby / Railsを使ってチーム開発でECサイト、ポートフォリオで投稿型Webアプリを作成。
- PaizaでD・Cランクの問題をRubyで約100問解答。
- Railsなどで作成したアプリケーション、ホームページ:3つ。
(実装機能:投稿・いいね・コメント・フォロー等)
所感
1〜8章までは、全体的に理解しながら進むことができましたが、9章から難しくなり一度読むだけでは理解できないことが増えました。
それでも、やり切ることが大切かと思ったので、わからない部分はメモをして、グイグイ進めました。
勢いとやる気と体力が必要な教材でしたが、細かいところまで丁寧に書かれていて、非常にわかりやすかったです。
(例えば、コマンドで下記のように実行するよう書かれていた場合、「> はターミナル上自動で出力されるので、書かなくていいです。」と毎度丁寧に教えてくれる。)
% XXXXXXXX /
> XXXXXX
進め方
手を動かしながらやらないと頭に入らないので、開発環境・本番環境で動かしながら進めました。
また、演習も全て解きながら進めました。
各章まとめ
各章 | タイトル | かかった時間 |
---|---|---|
1章 | ゼロからデプロイまで | 4h30m |
2章 | Toyアプリケーション | 2h30m |
3章 | ほぼ静的なページの作成 | 2h |
4章 | Rails風味のRuby | 11h |
5章 | レイアウトを作成する | 3h |
6章 | ユーザーのモデルを作成する | 5h |
7章 | ユーザー登録 | 4h |
8章 | 基本的なログイン機構 | 3h30m |
9章 | 発展的なログイン機構 | 3h30m |
10章 | ユーザーの更新・表示・削除 | 3h30m |
11章 | アカウントの有効化 | 3h |
12章 | パスワードの再設定 | 3h30m |
13章 | ユーザーのマイクロポスト | 3h30m |
14章 | ユーザーをフォローする | 3h |
合計時間:55h30m (約9h/日)
1章:ゼロからデプロイまで
最初のインストールで詰まってしまった。
- 演習問題数:4題
【発生したエラー】
①1.2.2 Railsをインストールするにて、Railsをインストールできなかった。
原因:下記のエラーから、rbenvのRubyではなく、システムのRubyのgemコマンドを実行している。
% gem install rails -v 6.0.3
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
下記のコマンドを実行。
% rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:
eval "$(rbenv init -)"
~/.zshrcにeval "$(rbenv init -)"を追記するために、ターミナルで下記のコマンドを実行。
無事、インストール成功。
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
②gemのインストールができなかった
エラー文に書いてあるように、% bundle update
で解決。
Bundler could not find compatible versions for gem "selenium-webdriver":
In Gemfile:
selenium-webdriver (= 3.142.4)
webdrivers (= 4.1.2) was resolved to 4.1.2, which depends on
selenium-webdriver (>= 3.0, < 4.0)
Bundler could not find compatible versions for gem "sprockets":
In snapshot (Gemfile.lock):
sprockets (= 4.0.2)
In Gemfile:
sass-rails (= 5.1.0) was resolved to 5.1.0, which depends on
sprockets (>= 2.8, < 4.0)
rails (~> 6.0.3, >= 6.0.3.4) was resolved to 6.0.3.4, which depends on
sprockets-rails (>= 2.0.0) was resolved to 3.2.2, which depends on
sprockets (>= 3.0.0)
Running `bundle update` will rebuild your snapshot from scratch, using
only
the gems in your Gemfile, which may resolve the conflict.
もしGemfileで指定されているのと異なるバージョンのgem (Rails自身のgemなど) をインストールしていた場合は、bundle updateを実行してgemを更新 (update) し、gemのバージョンを合わせておくとよいでしょう。
チュートリアル 3.1 セットアップより
2章:Toyアプリケーション
バージョン指定のアプリ作成ができず詰まってしまった。
- 演習問題数:7題
【発生したエラー】
① % rails _5.1.6_ new toy_app
ができなかった
原因:環境に指定したrailsのバージョン( 5.1.6 )が入っていなかった。
下記のコマンドで指定のバージョンをインストールして解決。
% gem install rails -v 5.1.6
% rails _5.1.6_ new toy_app
3章:ほぼ静的なページの作成
HTMl / CSS / テストがメイン。特に詰まることなく進んだ。
- 演習問題数:5題
4章:Rails風味のRuby
オブジェクト・クラス・インスタンス・シンボルなど、完全に理解してない部分がたくさん出てきて、
一度で全てを理解しきれず進みが一番遅い章だった。
- 演習問題数:11題
【発生したエラー】
①4.4.5 ユーザークラスで使用するアプリがtoy_appからsample_appになっていたので、エラーが発生していた。toy_appに変更したら解決した。
【理解が難しかったところ・調べた用語・参考記事】
- モジュールについて
- 破壊的メソッドについて
- リテラルコンストラクタがいまいちわからない(4.4.1 コンストラクタ が理解難しい…)
(参考記事:Railsチュートリアル 第4章 - Rails風味のRubyを学ぶ…クラス)
5章:レイアウトを作成する
特に詰まることなく進んだ。実際の画面を確認しながら進められるので、やっていて楽しかった。
- 演習問題数:9題
【理解が難しかったところ・調べた用語・参考記事】
- アセットパイプラインについて
(参考記事:Rails初学者がつまずきやすい「アセットパイプライン」)
- マニフェストファイルについて
- RESTの考え方
6章:ユーザーのモデルを作成する
正規表現が出てきた。一度、正規表現に関する記事を読んだだけだったので、再度復習しなければと思った。
演習を結構間違えてしまった。
- 演習問題数:13題
【理解が難しかったところ・調べた用語・参考記事】
- リレーショナルデータベース
- マイグレーション
- sandboxモード
- valid?メソッド
- assertメソッド
- :uniqueオプション
- dup(同じ属性を持つデータを複製するためのメソッドです)
- コールバック (callback) メソッド
- digest(暗号化用ハッシュ関数という用語が語源です)
- bcrypt gem
- authenticateメソッド
7章:ユーザー登録
理解が難しい文章が出てくるようになった。
- 演習問題数:14題
【理解が難しかったところ・調べた用語・参考記事】
- ハッシュ化
- hexdigestメソッド
- asideタグ
- pluralizeという英語専用のテキストヘルパー
8章:基本的なログイン機構
タイプミスでのエラーが多かった。
- 演習問題数:10題
【発生したエラー】
①下記のエラーが発生していた。
原因:path名を間違えていた。
ActionController::RoutingError: ActionController::RoutingError: No route matches [POST] "/signup"
test/integration/users_signup_test.rb:7:in `block (2 levels) in <class:UsersSignupTest>'
test/integration/users_signup_test.rb:6:in `block in <class:UsersSignupTest>'
19/19: [=====================================================================================] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.61060s
19 tests, 39 assertions, 0 failures, 1 errors, 0 skips
post users_path, params: {user: {name: "", email: "user@invalid", password: "foo", password_confirmation: "bar"}}
なのに、
post signup_path, params: {user: {name: "", email: "user@invalid", password: "foo", password_confirmation: "bar"}}
としていた。
②下記のエラーが発生していた。
原因:current_userがcuttent_userになってただけだった。
NameError in Users#show
Showing /Users/XXX/Desktop/Rails_tutorial/environment/sample_app/app/views/layouts/_header.html.erb where line #8 raised:
undefined local variable or method `current_user' for #<#<Class:0x00007fe0eb540190>:0x00007fe0f2883f58>
Did you mean? cuttent_user
【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】
- fixture (フィクスチャ)
- bcrypt
- digestメソッド
- app/helperってどんな役割だったけ、と。
(参考記事:rails helper 基本)
9章:発展的なログイン機構
ここから、1〜8章でなんとか覚えた用語が多発する。
- 演習問題数:7題
【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】
- 記憶ダイジェスト
- 記憶トークン
- model とhelperの違いってなんだっけ、と。
10章:ユーザーの更新・表示・削除
演習がほぼミスだったし、解答をみても1回で理解できなかった…。
- 演習問題数:15題
【発生したエラー】
①ドキュメント通りやってたら、userないよってエラー!
すべてに、@をつけたら解決。
(参考記事:Rails Tutorial10章 10.32のテストが通りません)
def create
@user = User.find_by(email: params[:session][:email].downcase)
if @user && @user.authenticate(params[:session][:password])
log_in @user
params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
redirect_back_or @user
else
(略)
@なしでやると下記のエラー発生。
ERROR["test_login_with_remembering", UsersLoginTest, 0.6073389999801293]
test_login_with_remembering#UsersLoginTest (0.61s)
NoMethodError: NoMethodError: undefined method `remember_token' for nil:NilClass
test/integration/users_login_test.rb:43:in `block in <class:UsersLoginTest>'
30/30: [=====] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.80407s
30 tests, 82 assertions, 0 failures, 1 errors, 0 skips
【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】
- controllerは_pathではなく_urlなのはどうして??
- toggle!メソッド
11章:アカウントの有効化
メールの部分、一度で理解できずに進めていたが、12章で動作確認する際に、再度11章を読み直したら1回目よりも理解できた。
2回・3回やることの大切さを実感。
- 演習問題数:9題
【発生したエラー】
① <%= form_for(@user, url: yield(:url)) do |f| %>
としていたところ、ユーザー新規登録で下記のエラー発生。
参考記事
→Routes.rb で postの/signupを作成するのはチュートリアルではそうしていないため、違うのではないかと。
-
【Railsチュートリアル】パーシャル実装によるルーティングの不正 を読んでrouting errorはなくなったが、testでエラー発生。テストのエラー解消を優先して、そのまま進める。
13章で再度、routing error解決していたので、下記をコメントアウトした。

12章:パスワードの再設定
herokuでメール送信のための設定を行わなかった。
何十分も悩むエラーは発生しなかった。
- 演習問題数:9題
13章:ユーザーのマイクロポスト
最後の演習がすごく難しかった。解けなかった。
- 演習問題数:15題
【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】
- default scopeの使い方
- find と find_by の違いってなんだっけ、と。
14章:ユーザーをフォローする
フォロー・フォロワーの関係は一度調べて図に書くと整理できます。
- 演習問題数:14題
【発生したエラー】
①herokuでApplication error。
原因:13.4.4 本番環境での画像アップロードにて、中途半端に下記のコードを追加していたのでエラー発生していた。その部分を削除したら、無事にデプロイできた。
class PictureUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_limit: [400, 400]
if Rails.env.production?
storage :fog
else
storage :file
end
下記が発生したエラー。
Application error
An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details. You can do this from the Heroku CLI with the command
heroku logs --tail
【理解が難しかったところ・調べた用語・ふとした疑問・参考記事】
- 複合キーインデックス
- :memberメソッド
- JavaScriptを前面に出すべからずという哲学
- ステータスフィード
終わりに
「プログラミングを勉強しよう!言語は、Ruby・Railsにしよう!まずは公式っぽいRailsチュートリアルからやろう!」としてる方は、挫折しそうだなって思いました。
Progateをやって、1つRailsでアプリを作成してデータの受け渡しなどをある程度理解できてからやると、非常に勉強になるなと思いました(それでも、後半挫折しそうでした)。
2周目できたら、「Railsチュートリアル(第4版) まとめ 2」として記事を書きたいと思います。
まとめ2 では後半の章について詳しくかけたらいいなと思います。
参考記事(まとめ)
- Railsチュートリアル 第4章 - Rails風味のRubyを学ぶ…クラス
- Rails初学者がつまずきやすい「アセットパイプライン」
- rails helper 基本
- Rails Tutorial10章 10.32のテストが通りません
- post '/signup'は必要ですか?
- Railsチュートリアル [第7章〜第8章] ユーザー登録でRouting Errorになる
- 【Railsチュートリアル】パーシャル実装によるルーティングの不正
演習の解答答え合わせで、非常にお世話になった記事