yuufuji0000
@yuufuji0000 (yuu)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

deviseでの新規登録がデータベースに反映されない

解決したいこと

現在、フリマアプリのWebアプリの作成をしております。

deviseで新規登録をしたところ、データベースに情報が反映されない。
原因を探ってみたが、エラーが解決されなかった。

発生している問題・エラー

 (0.1ms)  BEGIN
  User Exists? (0.2ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'yuu@gmail.com' LIMIT 1
   (0.1ms)  ROLLBACK
  Rendering devise/registrations/new.html.erb within layouts/application
  Rendered shared/_second-header.html.erb (Duration: 1.7ms | Allocations: 797)
  Rendered shared/_second-footer.html.erb (Duration: 0.6ms | Allocations: 427)
  Rendered devise/registrations/new.html.erb within layouts/application (Duration: 5.6ms | Allocations: 4978)
[Webpacker] Everything's up-to-date. Nothing to do
Completed 200 OK in 37ms (Views: 28.1ms | ActiveRecord: 0.4ms | Allocations: 31979)

該当するソースコード

controller

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :first_name, :last_name, :first_name_kana, :last_name_kana, :birthday, :encrypted_password])
  end
end

model

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :nickname, presence: true
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :first_name_kana, presence: true
  validates :last_name_kana, presence: true
  validates :birthday, presence: true
end

view

<%= render "shared/second-header"%>

<%# 「モデル名」にはUserモデルであれば@userを渡しましょう。「新規登録機能へのパス」は、devise導入後にrails routesを実行してdevise/registrations#createへのパスを確認し、記載してください。 %>
<%= form_with model: @user, url: new_user_registration_path, class: 'registration-main', local: true do |f| %>
<%# //「モデル名」にはUserモデルであれば@userを渡しましょう。「新規登録機能へのパス」は、devise導入後にrails routesを実行してdevise/registrations#createへのパスを確認し、記載してください。 %>
<div class='form-wrap'>
  <div class='form-header'>
    <h1 class='form-header-text'>
      会員情報入力
    </h1>
  </div>

  <%# インスタンスを渡して、エラー発生時にメッセージが表示されるようにしましょう。%>
  <%# render 'shared/error_messages', model: f.object %>
  <%# //インスタンスを渡して、エラー発生時にメッセージが表示されるようにしましょう。%>

  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">ニックネーム</label>
      <span class="indispensable">必須</span>
    </div>
    <%= f.text_area :nickname, class:"input-default", id:"nickname", placeholder:"例) furima太郎", maxlength:"40" %>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">メールアドレス</label>
      <span class="indispensable">必須</span>
    </div>
    <%= f.email_field :email, class:"input-default", id:"email", placeholder:"PC・携帯どちらでも可", autofocus: true %>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">パスワード</label>
      <span class="indispensable">必須</span>
    </div>
    <%= f.password_field :encrypted_password, class:"input-default", id:"password", placeholder:"6文字以上の半角英数字" %>
    <p class='info-text'>※英字と数字の両方を含めて設定してください</p>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">パスワード(確認)</label>
      <span class="indispensable">必須</span>
    </div>
    <%= f.password_field :password_confirmation, class:"input-default", id:"password-confirmation", placeholder:"同じパスワードを入力して下さい" %>
  </div>
  <div class="form-group">
    <p class='form-info-header'>
      本人確認
    </p>
    <p class='form-info-text'>
      安心・安全にご利用いただくために、お客さまの本人情報の登録にご協力ください。他のお客さまに公開されることはありません。
    </p>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">お名前(全角)</label>
      <span class="indispensable">必須</span>
    </div>
    <div class='input-name-wrap'>
      <%= f.text_area :last_name, class:"input-name", id:"last-name", placeholder:"例) 山田" %>
      <%= f.text_area :first_name, class:"input-name", id:"first-name", placeholder:"例) 陸太郎" %>
    </div>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">お名前カナ(全角)</label>
      <span class="indispensable">必須</span>
    </div>
    <div class='input-name-wrap'>
      <%= f.text_area :last_name_kana, class:"input-name", id:"last-name-kana", placeholder:"例) ヤマダ" %>
      <%= f.text_area :first_name_kana, class:"input-name", id:"first-name-kana", placeholder:"例) リクタロウ" %>
    </div>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">生年月日</label>
      <span class="indispensable">必須</span>
    </div>
    <div class='input-birth-wrap'>
      <%= raw sprintf(
                  f.date_select(
                    :birthday,
                    class:'select-birth',
                    id:"birth-date",
                    use_month_numbers: true,
                    prompt:'--',
                    start_year: 1930,
                    end_year: (Time.now.year - 5),
                    date_separator: '%s'),
                  "<p> 年 </p>", "<p> 月 </p>") + "<p> 日 </p>" %>
    </div>
    <p class='info-text'> 本人情報は正しく入力してください。会員登録後、修正するにはお時間を頂く場合があります。</p>
  </div>
  <div class="form-group">
    <h2 class='form-bottom-text'>
      「会員登録」のボタンを押すことにより、
      <span>利用規約</span>
      <br>に同意したものとみなします
    </h2>
  </div>
  <div class='register-btn'>
    <%= f.submit "会員登録" ,class:"register-red-btn" %>
  </div>
  <p class='register-info'>本人情報の登録について</p>
</div>
<% end %>
<%= render "shared/second-footer"%>

config

Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root to: 'items#index'
end

migrate

# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, unique: true, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :nickname,           null: false
      t.string :first_name,         null: false
      t.string :last_name,          null: false
      t.string :first_name_kana,    null: false
      t.string :last_name_kana,     null: false
      t.date   :birthday,           null: false

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

自分で試したこと

・データベースの確認をしたところ、usersテーブルには正常にカラムが作成されていたので、ここでエラーは起こらないと思った。
・ストロングパラメーターで許可した値は、ターミナル上に出力されているので、user自体の情報が保存されていない可能性があると思い、コントローラーやモデルの確認をしてみたが、データベースに情報が送られない原因が分からなかった。
=なぜ、新規登録をするときに正常にユーザー情報がデータベースに保存されないのか原因が掴めないので、どこにエラーが起きる原因があるのかご指摘頂けたら幸いです。

0

1Answer

    create_table :users do |t|
(中略)
      t.string :email,              null: false, unique: true, default: ""

とあるので,email が重複できないように見えます.

class User < ApplicationRecord
(中略)

Userクラスには,emailに対してバリデーションが無いようです.

このミスマッチがある所為で,もしかしたらModel としては valid だけどDBのレコードを作成できないのかもしれません.

1Like

Your answer might help someone💌