何度目かのRailsチュートリアル 覚え書き

今回、取り組んだバージョンは第2版(Rails 4.0)
総作業時間は1810分(約30時間)

railstutorial.jp

スキップ

不要と判断した部分は読み飛ばした。
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メソッド(以下、オリジナルメソッド)と重複しているので解消する。

    1. オリジナルメソッドをテストして、その正当性を確保する(テストはspec/helpers/application_helper_spec.rbに記述)
    2. テストでもオリジナルメソッドを使うために、spec/support/utilities.rbにinclude ApplicationHelperと書いてインクルードする
    3. テスト用メソッドは不要になったので削除する
  • メールアドレスの一意性を確保するために、モデルとデータベースの二段階で重複をチェックする。
    具体的には、モデルでは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つは著者の解答例(英語)