何度目かのRailsチュートリアル 覚え書き
今回、取り組んだバージョンは第2版(Rails 4.0)
総作業時間は1810分(約30時間)
スキップ
不要と判断した部分は読み飛ばした。
PostgreSQL導入は難しかったのでやめた。
- 3.5.3(演習:ローカル環境にPostgreSQL導入)
- 3.6(Guard, Spork導入など)
- 8.3(Cucumber導入)
- 8.5.2(演習:Cucumber関連)
覚え書き
full_title
メソッドはapp/helpers/application_helper.rbに置く。ビューから
render 'layouts/xxx'
でパーシャルを指定すると、app/views/layouts/_xxx.html.erbを参照する。RSpecのヘルパーメソッドは、spec/support/utilities.rbに定義する。
spec/support/utilities.rbに定義した
full_title
メソッド(以下、テスト用メソッド)は、app/helpers/application_helper.rbのfull_title
メソッド(以下、オリジナルメソッド)と重複しているので解消する。- オリジナルメソッドをテストして、その正当性を確保する(テストはspec/helpers/application_helper_spec.rbに記述)
- テストでもオリジナルメソッドを使うために、spec/support/utilities.rbに
include ApplicationHelper
と書いてインクルードする - テスト用メソッドは不要になったので削除する
メールアドレスの一意性を確保するために、モデルとデータベースの二段階で重複をチェックする。
具体的には、モデルではvalidates
メソッドのuniqueness
オプション、データベースではインデックスの一意性検証が機能する。has_secure_password
メソッドは非常に強力。
データベースにpassword_digest
カラムを置けば、様々な属性の追加から認証まで一手に引き受けてくれる。
(ソースコード:rails/secure_password.rb at master · rails/rails · GitHub)gravatar_for
メソッドは、Usersコントローラに関連するものなので、app/helpers/users_helper.rbに置く。複数のコントローラにまたがるパーシャルビューはapp/views/sharedディレクトリに配置する。
ユーザー登録後、コントローラがflash変数にメッセージを格納して、登録したユーザーページへリダイレクトする。
このとき、redirect_to user_url(@user)
とする必要はなく、単にredirect_to @user
と書けばよい。ユーザー登録フォームとは違い、サインインフォームには(Session)モデルがなく、
@user
のようなインスタンス変数がないので、form_for(:session, url: sessions_path)
としてヘルパーに情報を渡す。flash変数にメッセージを代入した後に、
render 'xxx'
とビューを描画するのはリクエストではないので、次のリクエストにもflashメッセージが残ってしまう。
これを回避するためには、flash
ではなくflash.now
を用いる。サインインに関するメソッドはapp/helpers/sessions_helper.rbに書く。
ヘルパーメソッドはビューだけでしか使えないので、Applicationコントローラにインクルードしてコントローラでも使えるようにする。form_for
はモデルを基にしたフォーム、form_tag
はモデルに関わらないフォームを作るときに使用する。
(参考:【Rails】form_for/form_tagの違い・使い分けをまとめた - Qiita)FactoryGirl.create(:user)
はモデルを作成してデータベースへの保存まで行う。
FactoryGirl.build(:user)
はモデルを作成するだけでデータベースへの保存は行わない。render @users
だけで、Railsは自動的に@users
をUserオブジェクトのリストであると推測し、app/views/users/_user.html.erbパーシャルを参照してリストの要素を全て出力してくれる。ユーザー削除時に付随したマイクロポストの削除を確認するテスト。
@user.microposts.to_a
でマイクロポスト配列を作ってからユーザーを削除する。
配列それ自体は存在し続けるので、配列要素である各マイクロポストがないことを確認することで検証される。Usersコントローラにある
signed_in_user
メソッドを、Micropostsコントローラでも使用するために、app/helpers/sessions_helper.rbに移動する。
セッションヘルパーは既にApplicationコントローラにインクルードされているので、コントローラでも使用可能になる。
参照
後半の演習で参考にしたもの
最後の3つは著者の解答例(英語)
- Railsチュートリアル 4.0版 の写経を完走した - メモ的な思考的な
- http://yaimapp.com/post/111832579450/ruby-on-rails-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB-%E7%AC%AC10%E7%AB%A0-%E6%BC%94%E7%BF%92
- Hartl's Rails Tutorial - Solutions for Ch 9 Exercises · JBerczel's
- Hartl's Rails Tutorial - Solutions for Ch 10 Exercises · JBerczel's
- Hartl's Rails Tutorial - Solutions for Ch 11 Exercises · JBerczel's