2020年4月27日月曜日

簡易SNSを作ってみよう(5)

ユーザー名での認証に切り替える(後半)

ビューの修正
ビューを修正する(下記以外に修正すべき箇所について要調査).
【手順】
vi app/views/devise/sessions/new.html.erb
vi app/views/devise/registrations/new.html.erb
vi app/views/devise/registrations/edit.html.erb
(それぞれ :email を :username に,:email_field を :text_field に修正)
<div class="field">
  <%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

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

vi app/views/devise/registrations/new.html.erb
vi app/views/devise/registrations/edit.html.erb
(それぞれ :username の箇所の下に,以下を追記)
<div class="field">
  <%= f.label :fullname %><br />
  <%= f.text_field :fullname, autocomplete: "fullname" %>
</div>
モデルの修正
「Email can’t be blank」のエラーが出てしまうので,モデルを修正する(抜本的な対処方法については要調査).
【手順】
vi app/models/user.rb
(以下を修正)
class User < ApplicationRecord
  # … 
  devise :database_authenticatable, :registerable,
         :rememberable, :validatable

  def email_required?
    false
  end
end

データベースの更新
email欄は使っていないが,同じデフォルト値で登録しようとすると重複エラーが発生してしまうので,マイグレーションファイルの「ユニーク制約」を外す処理を行い,マイグレーションを実施する.
【手順】
bin/rails g migration remove_index_email_from_users
vi db/migrate/XXXXXXXXXXXXXX_remove_index_email_from_users.rb
(以下を追加)
class RemoveIndexEmailFromUsers < ActiveRecord::Migration[6.0]
  def change
    remove_index :users, :email
  end
end

bin/rails db:migrate
ナビゲーションの追加
ビューにナビゲーションを追加する.
【手順】
vi app/views/layouts/application.html.erb
(以下を修正)
…(略)…
<body>
  <header>
    <nav>
      <% if user_signed_in? %>
        <%= link_to 'logout', 
destroy_user_session_path, method: :delete %>
      <% else %>
        <%= link_to 'sign up', new_user_registration_path  %>
        <%= link_to 'login', new_user_session_path  %>
      <% end %>
    </nav>
  </header>

確認
サーバを起動し,ユーザー登録を試みる.複数のユーザーを登録できることを確認し,Railsコンソールで User.all を表示させることでデータベースに正しく登録されていることを確認する.

0 件のコメント:

コメントを投稿