Ruby on Rails Tutorial (10)

Chapter 7 の exercise の不明点について確認を。

  • validation について
  • 追加した spec について
  • content_tag について

password_digest

あまり理解できていなかった模様。

  • Gemfile に bcrypt-ruby 3.0.1 を指定
  • user モデルに password_digest という属性を追加
    • この属性にはアクセスできなくて良い
  • attr_accessible に password および password_confirmation を追加
  • user モデルに has_secure_password を指定
    • これ、メソド呼び出しだったはずですよね。。

Chapter 6 をきちんと読んでいないのがバレバレですな。User.create する時には password_digest はスルーで accessible な二つの属性に同値を代入、なのか。

>> User.create(name: "Michael Hartl", email: "mhartl@example.com",
?>             password: "foobar", password_confirmation: "foobar")

なので、エラーメセジ自体は password_digest ではなく password にしておいて (config/locales/en.yml)、validate もどちらか一方で良い、という理解で良いのかどうか

追加した spec について

ええと、追加したのは以下ですよね (一部のみ)。

    describe "with valid information" do
      before do
        fill_in "Name",         with: "Example User"
        fill_in "Email",        with: "user@example.com"
        fill_in "Password",     with: "foobar"
        fill_in "Confirmation", with: "foobar"
      end

# 略

      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

登録成功して @user に登録したソレが、という形で登録後に表示されるナニを確認してます。確認している部分としては app/views/users/show.html.erb の以下の部分。

<% provide(:title, @user.name) %>

これは app/views/layouts/application.html.erb の以下で出力されてます。

<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>

title なソレはここを確認してます。そして、もう一つは app/views/layouts/application.html.erb の以下な部分の確認ですね。

  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |key, value| %>
        <%= content_tag(:div, value, class: "alert alert-#{key}") %>
      <% end %>

controller 側で登録成功したら云々、な記述があります。

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user

div.alert.alert-success ですし Welcome ですね。いやはや。

content_tag について

以下によれば

content_tag :p, "Hellow world"

<p>
Hello world
</p>

なんすか。ああ、確かに

        <%= content_tag(:div, value, class: "alert alert-#{key}") %>

        <div class="alert alert-<%= key %>"><%= value %></div>

ですね。どうもリハビリ微妙すぎる。何とも無い部分でひっかかってたりして。