New-Village

月間ブログ。だいたい1カ月に1回は更新しているようです。

Railsチュートリアル(第9章)

既存の仕事で能力の限界まで働いているのに、仕事を整理せずに週4日の常駐を命じたらどうなるでしょうか? → 全て完璧に遂行されて、会社の収益は向上する。

糞ったれ。 ということで、暫くあいだが開きました。

第9章 ユーザーの更新・表示・削除

9.1ユーザーを更新する

毎度のように、モックアップからテスト項目を作って、コントローラーを編集して、ビューを作ります。ユーザー更新画面で、テキストボックスにユーザー情報をセットする設定を何もしなかったので、不安に思っていたのですが、railsが勝手にやってくれました。

そして、もうひとつ驚いたのが、以下の一文。まったく同じコードから生成された画面でユーザー情報を送信すると、Railsは、そのユーザーが存在するかどうか確認して、勝手にアクションを選択してくれるということらしいです。(パフォーマンス的に毎回DBを探しにいっちゃうのはどうなんだろう…とも思いますが。)

Railsは、form_for(@user)を使用してフォームを構成すると、@user.new_record?がtrueのときにはPOSTを、falseのときにはPATCHを使用します。

ユーザー編集画面ができたので、テストを編集して、ヘッダーのリンクを修正します。テストでサインインするロジックを"spec/support/utilities.rb"に書くように指示があるが、ここの意味が全然わからない。カピバラ(Capybara)さんって何だっけ?自動入力?(リスト9.6)

9.1.2 編集の失敗

DBのデータをupdateする(update_attributes)際には、Strong Parameter(7.3.2)を使う。

9.1.3編集の成功

全てのテストにパスしていたのに、コントローラーのupdateアクションを編集したら、以下のような大量のエラーに悩まされるようになった。エラーの出方も不自然で途方に暮れていたが、エラーが出ているコントローラーに、"# encoding: utf-8"を記載したら、全てのエラーが解消された。コントローラーの特定アクションに文字コード指定無しに日本語を使うと、そのコントローラー全体が動かなくなるので注意が必要である。

$ rspec spec

.......................FFFFFFFFFFFFFFFFFF..FFFFFF............

Failures:

  1) User pages プロファイル・ページの表示 

     Failure/Error: before { visit user_path(user) }

     SyntaxError:

/var/lib/stickshift/52e69b575004466e70000a58/app-root/data/lib/ruby/gems/gems/rspec-core-2.13.1/lib/rspec/core/formatters/base_text_formatter.rb:264:in `split': invalid byte sequence in US-ASCII (ArgumentError)

9.2.1ユーザーのサインインを要求する 

rspecから直にpatchやdestoryのRESTリクエストを出せるらしい。これを使ってログインしていない状態でPATCHリクエストを出すテストをやっている。

9.3.2サンプルのユーザー

サンプルユーザーの作成もフレームワークに含まれるなんて、気が利きすぎて、意味気持ち悪い(笑)

チュートリアルでは、普通にgemfileに記述していたが、この手のツールはdevelopmentとtestだけでいい気もする。

9.3.4パーシャルのリファクタリング

もう何がなんだかよくわからないんだけど、すげー(笑)

Railsは@usersをUserオブジェクトのリストであると推測します。さらに、ユーザーのコレクションを与えて呼び出すと、Railsは自動的にユーザーのコレクションを列挙し、それぞれのユーザーを_user.html.erbパーシャルで出力します。

9.4ユーザーを削除する 

すげぇ。admin属性カラムを作って、このユーザーはadmin?と聞けば、答えが返ってくるし、このユーザーにtoggle!(:admin)とすれば、admin権限が付与される。

$ rails console --sandbox

>> user = User.first

>> user.admin?

=> false

>> user.toggle!(:admin)

=> true

>> user.admin?

=> true

9.6 演習

演習の答えが書かれていないモノがある気がする…ので、自分なりの答えを記しておく。

 

2. リスト9.3の Gravatarの [change] リンクを改造し、別ウィンドウ (または別タブ) で開くようにしてください。ヒント: Webを検索してみましょう。この目的にうってつけの堅牢なメソッドが見つかるはずです。_blankという文字も一緒に検索してみてください。

edit.html.erb

<!-- <a href="http://gravatar.com/emails">変更</a> -->

<%= link_to "変更", "http://gravatar.com/emails", target: ["_blank"] %>

3. 現状の認証テストでは、ユーザーがサインインすると [Profile] や [Settings] などのリンクは表示されることをチェックしています。その逆に、ユーザーがサインインしていないときはこれらのリンクが表示されないことを確認するテストも追加してください。

authentication_pages_spec.rb

describe "サインアウトのテスト" do

  before { click_link "Sign out" }

  it { should have_link('Sign in') }

  # 9.6 Exercise 3

  it { should_not have_link('Users',        href: users_path) }

  it { should_not have_link('Profile',      href: user_path(user)) }

  it { should_not have_link('Settings',     href: edit_user_path(user)) }

end