Ruby on Rails チュートリアル やってみてる ~8章~

どうも。
体調を壊してしまい前回から少し間が空いてしまいました。

今回は8章です。前回はユーザーを登録してそのユーザーの情報を表示させるところまでを作りました。

8章ではその登録したユーザーでのサインイン、更にサインアウトを主な内容としています。

結果から言うとこの8章は今までで一番時間がかかりました。4日間くらいでしょうか。それはこの章の難易度というよりは、謎のエラーによるものでした。これから8章に入る方はこまめにブランチを切ったりpushしたりしておいた方がいいっす。

今回の記事ではgithubからローカルにcloneしてもう一度同じ状態に戻す手順も紹介します。だって泣きそうになりながらめっちゃ調べて何とか直ったんだもん(ToT)Gitもっと上手く使えるようになりたい!!9章入る前にGitの勉強しようかなと思う。

前置きが長くなりましたが、8章のまとめいってもいいかな?

f:id:yuruihito:20150224105933j:plain

 

8章の概要

第8章 サインイン、サインアウト

タイトルの通り登録したユーザーをサインインおよびサインアウトさせる機能を実装していきます。

認証の周りなのでかなり複雑なんじゃないかと思っていたのですが、そういえば前回まででセキュアな状態でのユーザー情報の登録の準備はできていたので、認証に関してはそこまで難しいところはありませんでした。

セッション情報をcookieに保持してサインイン状態を維持するというあたりと、それを開放してサインアウトするというところでしょうか。

それとサインインしているユーザーとサインアウト状態のユーザーで出ているものが違うよね?というテストを書いたりしたと思います。

サインイン画面を実装していき、認証に失敗すればエラーをメッセージが表示されますが、ここにもユーザー登録画面と同様にエラーが表示されているというテストを書いていきます。

サインイン機能としてはフォームを作った後に実装するのはサインイン成功ではなく、サインイン失敗になります。作者が意図していることかはわかりませんが、この順番、いいですよね。サインインができることよりもサインインがちゃんと失敗するってことの方がユーザー情報を扱うシステムでは重要です。

で、サインインしたらcurrent_userという変数を引っ張ってサインインしているユーザーとしてのサイト内での振る舞いや、ブラウザを一旦落とした後もまたサインイン状態が残っていることを確認したりします。このトークンは20年後まで保存されるそうなのですが、それが本当に20年後に期限が切れるテストは書かれていませんでした。これはRailsの機能なので任せようということなのでしょう。

ヘッダーのレイアウトにはif文を使ってサインイン状態によってメニューを出し分ける条件を追加します。サインアウト状態なのにSign outリンクが出ているのはおかしいですよね。

僕が好きなBootstrapを使ってアカウントメニューがドロップダウンで表示されるようになります。かっこいい。

また、ユーザー登録が完了した後にはサインイン画面を出さずにそのままサインイン状態の画面を表示し、ウェルカムメッセージでお祝いしてくれます。

そしてサインアウト機能を実装してほぼ終わりです。

最後にはCucumberでのテストの仕方がありますが、ここは飛ばしても良いと言われています。ですが、ここを飛ばしちゃうと演習がさっぱりわからないと思うので一応サラッとやってみてください。写経するだけなんで。

 

ハマったところ

8.1.1 Sessionコントローラのテストでpending

サインインページの実装のとこのテストで、レイアウトとかルーティングとかコントローラーとか追加した時にテストがパスするはずなのに以下の表示。

Pending:
SessionsHelper add some examples to (or delete)

 って出るけど、別の箇所のことなのでここでは無視した。その後通るようになったし大丈夫だと思う。

 

何をしてもエラーが出て進まなくなったのでgithubからcloneした

途中からテストでエラーが出るようになり、手を加えれば加えるほど新たなエラーが出たのでgitで8章の最初のコードに戻そうと思ったんだけど調べてやってもどうもうまくいかない。。
以前仕事でコードをgithubからローカル環境にcloneしたことがあるのを思い出して試してみた。
結果から言うとちゃんと8章の最初の環境にできたんだけど、そこに至るまでが相当大変だったので、cloneしてから再度実装に入れる状態になるまでを簡単にまとめようと思う。自分のためにも。。。。

1. githubで戻したいcommitのリポジトリのページからclone URLをコピー

GitHubにあるリポジトリをローカルにcloneする方法 - Qiita

↑を参考にコピーする。

2. 古いsample_appフォルダをゴミ箱に移動

消さないと既にあるって言われてcloneできないから。

3. プロジェクトのディレクトリに移動してclone

cd でsample_appフォルダが置いてあったディレクトリに移動して以下を実行する。

git clone コピーしたcloneURL

 4. cloneしたフォルダに移動してgemをインストールする

普通にbundle installするとなんか怒られるので以下を実行する。

bundle install --without production

その後bundle installしても怒られなくなるのでbundle installする。

5. migrationする

この段階でbundle exec rspec spec/すると以下のエラーが出る。

Migrations are pending; run 'bin/rake db:migrate RAILS_ENV=test' to resolve this issue. (ActiveRecord::PendingMigrationError)

なので以下を実行。

rake db:migrate RAILS_ENV=test

 これでもう一回テストしてみるとちゃんとテストが回ったー!いえーい!

このままでは開発環境が見れないので、

rake db:migrate RAILS_ENV=development

これでだいたいOKなはず。足りないところがあったらコメントよろしくお願いします。。 

 

6. 8章を最初からやり直す

・・・・・・・。

 

git push herokuで謎のエラー

8章の最後にいつものように本番環境に反映させるわけですが、git push herokuすると以下のエラー。

fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

なにこれ。。。翻訳してみよう。

決定的:'heroku'はgit宝庫であるようではない
決定的:リモートの宝庫から読むことができなかった。

意味わかんねえ。。。

いろいろ調べてグチャグチャやってみたけど全然治らないっていうか他のエラーがジャンジャン出てくる。。2時間くらい彷徨ってたかも。。。
で、herokuにpushした直前の”Finish sign in”に戻してから以下を試すと解決した。

git remote add heroku git@heroku.com:【herokuのプロジェクト名】.git

この後に heroku open してもエラー表示されるからね。マイグレーションしてね。

heroku run rake db:migrate

 参考:
http://d.hatena.ne.jp/s-0samu/20110416

 

正解のコードの全文がなくて入れ子の関係とかが不安になってくる

この章をやっていると1ファイルに書くコードが多くなってくるため既に書いてあるコードは「・・・」みたいに省略されて表示されている。
どこが追加されたところなのかがわかりやすくはなってるんだけど、章の最後まで行った時に、じゃあそのファイルは結局どういうコードになっているのが正解なのか知りたくなっても全文は記載されていないので不安になってきます。
こういう感じで。

f:id:yuruihito:20150224131308p:plain

こうなったらね、もうね、勘が良い人ならわかるでしょうけど、githubで8章の完了時点のコミット名である「Finish sign in」のリポジトリを探せばいいんすよ・・・。いっぱいありますよそりゃ。

というわけで不安になったらgithubで先に完了してくれてる人のコードを見せてもらいましょう。

参考:
Finish sign in · ad21351 · imaginaryset/sample_app · GitHub

 

演習

演習1はいきなりform_tagにしろって言われても今まで使ったことないんだからわかるわけがなかった。
なのでググって正解を見ながら写経しました。すいませんでした。

参考:

Railsチュートリアル 4.0版の演習について、自分なりの解答をまとめてみた - メモ的な思考的な

演習2に関してもさっぱりわからなかった。githubに演習2のコードのビフォーアフターがあったので写経させてもらった。すいませんでした。
でも答えのコードを読むとやっと問題の意味がわかってきた。この章の演習はちょっとヒントが少なすぎた僕には。

参考:

8.5.2-after · cb38e3e · thinkAmi/rails_tutorial-syakyo · GitHub

 

感想など

というわけで演習はザッツカンニングでした。
とにかくゲームセンターCXでいうところの”戻し作業”と急に出たherokuのエラーに泣かされました。
同じようにハマった人には早く僕の記事にたどり着くことを祈るばかりです。

かなり苦労した8章でしたが、内容自体はとても楽しいものでした。

 

さて、話は少し変わりますが、前回のRoRチュートリアルシリーズの記事になんと中の人であるyasulab (id:yasulabs)さんからコメントをいただいてしまいました。僕が最初の記事で「神様ですか!?」と言った方からのコメントだったので正直驚きました。神様って本当にいるんですね。

yasulabさんからのコメントを引用しますと。

Railsの機能毎にまとめられた「Railsガイド」という大型リファレンスも最近制作したので、もしRailsの機能で詳しく知りたい機能などがありましたら、こちらからより深く学べるかなと思います :D

Railsガイド
http://railsguides.jp/

RailsガイドはRailsチュートリアルの2倍ぐらいの量があるので(チュートリアルが約700pでガイドが約1300~1400p)、チュートリアルの参考書みたいな感じで使うのがよいかなと思います :D

とのことです。
まだ作成途中の項もあるようですが、私のような学びたいけどどうしていいかわからない人間のためにもyasulabさんはまとめてくださっているのです。

皆さんもRailsガイドを参考にしてみましょう。
yasulabさんご丁寧にコメントありがとうございました。俄然モチベーションが上がりましたので必ずRoRチュートリアル完走します。

 

さあ、次は9章。「ユーザーの更新・表示・削除」だそうです。
表の画面からユーザーの情報を変更したり削除できるようにするのでしょうか。
DBな感じがするので少し難しそうですが気楽にやってみようと思います。
その前にGitをちょっと勉強しよ。。。

ではでは。花粉症に負けないでください。

 

Ruby on Rails チュートリアル やってみてるシリーズ:

はじめに

第1章 ゼロからデプロイまで

第2章デモアプリケーション

第3章ほぼ静的なページの作成

第4章 Rails風味のRuby

第5章レイアウトを作成する

第6章ユーザーのモデルを作成する

第7章ユーザー登録

第8章サインイン、サインアウト

 

juice=juiceいいわぁ。ハロプロで初めて好きになったかも。