大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

初めてのポートフォリオ作成 #3.5

今回は「初めてのポートフォリオ作成」#3の続きです。

#3の日記はこちら。 

 

過去の日記はこちら

初めてのポートフォリオ作成 #0 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #1 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #2 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #2.5 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #3 - 大田区から発信するゆるゆる日記

 

恐らくおかしな点があるかと思いますので、その時は教えて頂けると嬉しいです。

 

※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。 

【目次】

やりたいこと(前回の日記と同じ)

devise gemを用いてユーザー・ログイン機能を実装する。また、ネストしている別テーブルの性別テーブルからデータ出力と保存を行う。

 

ユーザー・ログイン機能の実装

サインアップやユーザ情報を編集する時に「gender」「nickname」も登録できるように項目を追加していきます。

 

routesの設定を変更

「devise_for」が参照するコントローラ先を変更

routes.rb

  devise_for :users, :controllers => {
:registrations => 'users/registrations',
:sessions => 'users/sessions',
:passwords => 'users/passwords'
}

サインアップに関する記述がされている「registrations」コントローラ以外にも、「registrations」「sessions」コントローラもついでに変更しました。 

 

コントローラの設定を変更

サインアップ時に元々許可されている項目(「password」や「email」など)以外の「gender」「nickname」のストロングパラメータを追加させる。

application_controller.rb 

////

before_action :configure_permitted_parameters, if: :devise_controller?

////

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

これでサインアップやログイン画面で「gender」「nickname」項目を作成することができます。 

 

記載する順序がおかしいかもしれませんが、先にコントローラの記述を全て書いてしまいます。

 

ユーザ詳細ページがログインしていない時には見れないように、コントローラを変更します。

controllers/users_conntroller.rb 

before_action :authenticate_user!, only: [:show]

 

ビューを変更

サインアップページの項目を変更します。

registrations/new.html.erb 

////

<div class="field">
<%= f.label :ニックネーム %><br />
<%= f.text_field :nickname, autofocus: true, autocomplete: "nickname" %>
</div>

<div class="field">
<%= f.label :性別 %><br />
<%= f.collection_select :gender_id, Gender.find(1,2,9), :id, :gender %>
</div>

////

「gender」項目についてですが、「gender」テーブルのデータを元に選択しを生成するので、「collection_select」メソッドを使用しています。

また、「gender」テーブルは国際規格に基づいて作成したのですが、今回は「未回答」を選択できないようにしたかったので、「find」メソッドで「男性・女性・その他」だけを選択できるようにしています。

 

ユーザー情報編集ページの「registrations/edit.html.erb」も上記と同じように変更します。

 

最後に、部分テンプレートでログイン項目などを表示できるように「_header.html.erb」を作成します。

share/_header.html.erb

<header class="header">
<div class="header__bar row">
<h1 class=""><a href="/">アプリ名</a></h1>
<% if user_signed_in? %>
<div class="user_nav">
<span><%= current_user.nickname %>
<ul class="user__info">
<li>
<a href="/users/<%= current_user.id %>">マイページ</a>
<a href="/users/edit">編集</a>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
</li>
</ul>
</span>
</div>
<% else %>
<div class="">
<%= link_to "ログイン", login_path, class: 'post' %>
<%= link_to "新規登録", sign_up_path, class: 'post' %>
</div>
<% end %>
</div>
</header>

 ※スクールの内容をそのまま転用しているので、内容は好みに合わせて変更させてください。

 

この「_header.html.erb」を「show.html.erb」に部分テンプレートとして引き渡します。

 

※補足

URLを短くしたかったので、デフォルトルーティングを変更しています。

Deviseのデフォルトスコープを指定する機能を活用しました。

routes.rb

////

devise_scope :user do
get 'login' => 'users/sessions#new'
get 'sign_up' => 'users/registrations#new'
get 'edit' => 'users/registrations#edit'
delete 'logout' => 'users/sessions#destroy'
end

////

 

今後に向けて

少しずつ成長しているのは分かるけど、成長スピードが遅すぎて自信なくす。。。

 

参考サイト

GitHub - plataformatec/devise: Flexible authentication solution for Rails with Warden.