迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【rails】ユーザ管理機能の導入について その2

前回ユーザ管理機能導入のための下準備を行いました。

 

前回行ったことは

  1. devise gemの導入
  2. userモデル(テーブル)の作成
  3. web画面(view)の作成

でした。

 

本日はtask一覧画面にユーザ登録(Sign Up)、ログイン(Sign In)、ログアウト(Sing Out)リンクを作成し、ログインしていれば、task一覧画面にユーザ名が表示されるようにしたいと思います。

 

本日やること

  1. task一覧画面にユーザ管理するためのリンク作成
  2. ユーザ登録画面の編集とストロングパラメータの設定
  3. task一覧画面にユーザ名を表示

 

まずはtask一覧画面にリンクを作成します。実装内容はviews/tasks/index.html.erbの<%= link_to 'New Task', 〜>と記述されている部分を以下の内容で書き換えます。

 

<% if user_signed_in? %>
 <%= link_to 'New Task', new_task_path %>
 <%= link_to 'Sign Out', destroy_user_session_path, method: :delete %>
<% else %>
 <%= link_to 'Sign In', new_user_session_path %>
 <%= link_to 'Sign Up', new_user_registration_path %> <% end %>

 

実装内容を簡単に説明するとlink_toでユーザ登録、ログイン、ログアウトするため画面にリンクできるようにします(ログアウトはtask一覧画面に戻ります)

 

if文でログイン中であれば、task登録とログアウトのリンクが表示せれるよう制御しています。

 

次にユーザ登録画面の編集を行います。views/devise/registrations/new.html.erbにユーザ名登録部分を追加しました。

 

<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
 <%= render "devise/shared/error_messages", resource: resource %>

<div class="field">
 <%= f.label :name %><br />
 <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>

<div class="field">
 <%= f.label :email %><br />
 <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

#以下省略

 

ユーザ名(name)を登録するためのtextボックスを追加します。

 

次に新たに追加したユーザ名(name)をusersテーブルに登録できるようにするためにストロングパラメータ設定を行います。

 

controllers/application_controller.erbに以下の内容を追記します。

 

class ApplicationController < ActionController::Base

  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end

end

 

ストロングパラメータ等の概念の説明はまたの機械にするとして、処理内容を簡単に説明するとユーザ登録(sign_up)するときにnameを登録することを許可する記述をしています。before_actionで記述することで、ユーザ管理関連の処理が呼び出される前に、nameを許可させることができます。

 

これでユーザ登録、ログイン、ログアウトができるようになりました。

 

最後にログイン中はユーザ名をtask一覧画面に表示させます。

 

<h1>Tasks</h1>

<% if user_signed_in? %>
  <p>Sign In User : <%= current_user.name %></p>
<% end %>

<table>
  <thead>
    <tr>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>

 

current_user.nameと記述することで、現在ログインしているユーザ名を取得できます。

 

これでユーザ管理機能を実装を終わります。

railsではdevise-gemを活用することで、最小限の記述でユーザ管理機能を実現できます。

 

あとがき

記述量は少ないですが、一行一行が意味するところは結構重要なので今後少しづつ解説を付け加えていきたいと思います。