第7章の回答メモです。
「ユーザー登録」
問1
問
リスト7.31のコードを使用して、7.1.4で定義されたgravatar_forヘルパーにオプションのsizeパラメーターを取ることができる (gravatar_for user, size: 40のようなコードをビューで使用できる) ことを確認してください。(9.3.1でこれを改善したヘルパーを使います)
回答
user_helper.rb
module UsersHelper
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」となる。
問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'
assert_select 'div.field_with_errors'
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 %>
ここまで