Ruby on Rails Tutorial (9)

へろへろながらフライングで exercise を云々。
Defining an optional :size parameter for the gravatar_for helper. ということで app/helpers/users_helper.rb が例示されています。

module UsersHelper

  # Returns the Gravatar (http://gravatar.com/) for the given user.
  def gravatar_for(user, options = { size: 50 })
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

gravatar_for user, size: 40 な記述を view で云々とのこと。今の記述は

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="span4">
    <section>
      <h1>
        <%= gravatar_for @user %>

みたいなカンジ。
これ、gravatar の制約な世界なのかどうなのか。てか、gravatar て size な指定ができるんですね。github で使えないかなぁ。とりあえず直接アクセスして表示確認はできました。

2.Write tests for the error messages implemented in Listing 7.22. A suggested start appears in Listing 7.31.

とのことで以下を盛り込んで green 確認。branch 作って盛り込んでいます。

    let(:submit) { "Create my account" }

    describe "with invalid information" do
      it "should not create a user" do
        expect { click_button submit }.not_to change(User, :count)
      end

      describe "after submission" do
        before { click_button submit }

        it { should have_selector('title', text: 'Sign up') }
        it { should have_content('error') }
      end
    end

その次の三番目の問題

とりあえず config/locales/en.yml を以下な状態にして

en:
  hello: "Hello world"

  activerecord:
    attributes:
      user:
        password_digest: "Password"

パスワードを空で signup してみると出力されたメセジが以下。

* Password can't be blank
* Password can't be blank
* Password is too short (minimum is 6 characters)
* Password confirmation can't be blank

重複するので app/model/user.rb の validates を云々、とあるのだな。こうしてリトライ。

  validates :password, length: { minimum: 6 }
  validates :password_confirmation, presence: true

これ、一体どーゆーことなのかな。別途確認の方向にて。試験は一応 green 確認。

その次の四番目の問題

以下な試験を spec/requests/user_pages_spec.rb "with valid information" なソレに追加。

      describe "after saving the user" do
        before { click_button submit }
        let(:user) { User.find_by_email('user@example.com') }

        it { should have_selector('title', text: user.name) }
        it { should have_selector('div.alert.alert-success', text: 'Welcome') }
      end

とりあえず試験を実行してみました。げ、通りやがった。こちらも別途詳細確認。

そのまた次の五番目の問題

ここも content_tag というソレを確認した方が良さげ。
試しに盛り込んでみます。app/views/layouts/application.html.erb を以下に。

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

以下とどう違うのか。

      <% flash.each do |key, value| %>
        <div class="alert alert-<%= key %>"><%= value %></div>
      <% end %>

挙動自体は変わりなし、です。別途確認入れます。