tjinjin's blog

インフラ要素多めの個人メモ

Railstutorial学習記録9

日が空きましたが、8章をやっていきます。

やったこと

  • サインイン/サインアウトの実装
  • cucumberの使い方

メモ

  • rspec-eオプションを渡すことで、特定のテストが実行できる。これはdescribeで指定している文字列に合致するものだけ実行されるようです。(7章でも書いてましたね^^;
describe "signin"
  describe "with invalid information" do
      before { click_button "Sign in" }

      it { should have_title('Sign in') }
      it { should have_selector('div.alert.alert-error', text: 'Invalid') }
    end

    describe "after visiting another page" do
      before { click_link "Home" }
      it { should_not have_selector('div.alert.alert-error') }
    end
end

となっている場合"signin"とすると両方のテストが、”after visiting another page"とすると リンククリック後のテストがされます。今回はネストされているので、"signin with invalid information"としてもテストが実行できました。

  • flashだとエラーメッセージが残留するので、flash.nowにするらしい。flashは自リクエスト+次のリクエスト終了まで残り、flash.nowは自リクエスト内でしか残らないということなのかな。redirect_toした先の画面でメッセージを表示したい場合に使うらしい。

  • セッション管理にSessionsHelperを使う。コントローラでincludeするだけで簡単に使える

デフォルトでは、すべてのヘルパーはビューで使用できますが、コントローラでは使用可能になっていません。Sessionsヘルパーはビューとコントローラの両方でメソッドが必要となるので、コントローラでは上のように明示的にインクルードする必要があります。

  • bundle exec rake db:migrateでdb/scheme.rb(たぶん)を更新して、bundle exec rake db:test:prepareでテストdbを更新する。

  • 取得したトークンはdbに暗号化して格納する。そしてユーザから送られてトークンを暗号化して、dbと比較することでユーザを確認する。さらにセキュアにするなら新しいセッション毎にトークンを発行する。

コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです

  • 下記のテストは同等
its(:remember_token) { should_not be_blank }
it { expect(@user.remember_token).not_to be_blank }
  • 要素代入関数
self.current_user = ...
current_user=(...)
  • ||=は変数が未定義のときに右側の式が代入される。
@user = @user || "the user"
@user ||= "the user"

感想

  • typoをしていても気づかないことが多くて、rspecを実行したときにNo methodエラーが出て初めてtypoに気づくことが何度もありました。Javaでの開発の時はIDE使ってたので、こういうミスは未然に防げてたのですが、rubyになってvimでの開発になって増えてきたかも。Rsenseとかいれたり、Rubymineに変更するなり対策を検討中です。