Madogiwa Blog

主に技術系の学習メモに使っていきます。

RubyonRails:RubyonRailsチュートリアル回答メモ(第7章)

第7章の回答メモです。

「ユーザー登録」

問1

リスト7.31のコードを使用して、7.1.4で定義されたgravatar_forヘルパーにオプションのsizeパラメーターを取ることができる (gravatar_for user, size: 40のようなコードをビューで使用できる) ことを確認してください。(9.3.1でこれを改善したヘルパーを使います)

回答

user_helper.rb

module UsersHelper
# 引数で与えられたユーザのGravator画像を返す
  def gravator_for(user,options = {size: 80})
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravator_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravator_url,alt: user.name,class: "gravatar")
  end
end

プロフィール画像のサイズが指定したとおり、「80px,80px」となる。 f:id:madogiwa0124:20160925222846p:plain

問2

リスト7.18で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト7.32にテンプレートを用意しておいたので、参考にしてください。

回答

users_signup_test

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path,user:{
        name:                  "",
        email:                 "user@invalid",
        password:              "foo",
        password_confirmation: "bar"
      }
    end
    assert_template 'users/new'
    assert_select 'div#error_explanation' # 生成されるHTML要素に左記が含まれるかtest
    assert_select 'div.field_with_errors'   # 生成されるHTML要素に左記が含まれるかtest
  end

問3

7.4.2で実装したflashに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。 リスト7.33に最小限のテンプレートを用意しておいたので、参考にしてください (ヒント: FILL_INメソッドを適切なコードに置き換えると完成します)。(テキストに対するテストは壊れやすいです。文量の少ないflashのキーであっても、それは同じです。個人的には、flashが空でないかをテストするだけの場合が多いです)

回答

user_signup_test.rb

  test "valid signup information" do
    get signup_path
    assert_difference 'User.count',1 do
      post_via_redirect users_path,user:{
        name:                  "Example User",
        email:                 "user@example.com",
        password:              "password",
        password_confirmation: "password"
      }
    end
    assert_template 'users/show'
    assert_not flash.empty? # 追加
  end
end

問4

7.4.2で触れたように、flash用のHTML (リスト7.25) は読みにくいです。より読みやすくしたリスト7.34のコードに対してテストスイートを実行し、こちらも正常に動作することを確認してください。このコードでは、Railsのcontent_tagヘルパーを使用しています。

回答

application.html.erb

      <% flash.each do |message_type,message| %>
         <%= content_tag(:div, message, class: "alert alert-#{message_type}") %>
      <% end %>

ここまで