かすたあどくりいむ定食

育児、プラモ、音楽(バンド)が趣味なエンジニア(かもしれない)ブログです。

Rails tutorial 2週目やってみた2

こんにちわ。じゃなくてこんばんは。 先週は台風がきて、とても大変だったのですが、今週は平和でしたね。

前回に続きRails tutorial 7章以降の学びをアウトプットしようと思います。

主に6章あたりからユーザーモデル関連のことに入っていきました。

前回

hellhellmymy.hatenablog.com

今回は7章

7章からユーザー登録の処理を書いていきます。

今回も全てではなく新しい学びや大事だと思った部分に絞って書いていきます。

コントローラーではストロングパラメーターで受け取る値を許可します。 許可というか外部から他のいらない情報の値を操作されないようにする(指定したもの以外は許可しない)ことができます。

class UsersController < ApplicationController
  .
  .
  .
  def create
    @user = User.new(user_params)
    if @user.save
      # 保存の成功をここで扱う。
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

エラー表示

ユーザー登録失敗時のエラーメッセージを .errors.full_messagesオブジェクトで確認することができます。

$ rails console
>> user = User.new(name: "Foo Bar", email: "foo@invalid",
?>                 password: "dude", password_confirmation: "dude")
>> user.save
=> false
>> user.errors.full_messages
=> ["Email is invalid", "Password is too short (minimum is 6 characters)"]

エラーメッセージを表示させます。

<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

こちらはのhtml.erbファイルにこの記述を追加し

<%= render 'shared/error_messages' %>

そしてパーシャルを読み込むため app/views/sharedに

_error_messages.html.erbファイルを作成します。

<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

if @user.errors.any? の記述で@userの配列にエラーが存在したらエラーメッセージとエラー数を表示させます。 @user.errors.count, "error"この記述ですね。コンソール上でも確認することができます。

今回ユーザー登録時のエラー表示の仕組みについて詳しく知ることができました。 8章も含めるとボリュームが大きすぎるので一回ここで区切ります。

では!!!!!