pinoko72447
@pinoko72447 (中村 いぬ)

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!

[ruby on rails]deviseで新規登録ができない

解決したいこと

ruby on railsのdeviseを用いて、ログイン機能を作っています。
新規登録した際にエラーは出ないのですが、なぜかデータベースに保存されません。

初期状態で新規登録の確認を行ったときは正常に作動しました。
おそらく
・nameカラムを追加した
・deviseのviewファイルを編集した
ことによりデータベースへ保存されなくなったと思われるのですが、解決方法がわかりません。

当方初心者ですので、見当違いな質問をしてしまっていれば申し訳ありません。
どなたかご教授お願いしますm(_ _)m

新規登録画面のview

<div class="main container">
  <div class="card devise-card">
    <div class="form-wrap">
      <div class="form-group text-center">
        <h2 class="logo-img mx-auto"></h2>
        <p class="text-secondary">新しい仲間とつながろう</p>
      </div>
      <%= form_with scope: resource, as: resource_name, url: registration_path(resource_name), local: true do |f| %>
      <div class="form-group">
        <%= f.email_field :email, autofocus: true, placeholder: "メールアドレス", class: "form-control" %>
      </div>


      <div class="form-group">
        <%= f.text_field :name, autofocus: true, placeholder: "フルネーム", class: "form-control" %>
      </div>


      <div class="form-group">
        <%= f.password_field :password, autocomplete: "off", placeholder: "パスワード", class: "form-control" %>
      </div>

      <div class="form-group">
        <%= f.password_field :password_confirmation, autocomplete: "off", placeholder: "パスワードの確認", class: "form-control" %>
      </div>


      <div class="actions">
        <%= f.submit "登録する", class: "btn btn-primary w-100" %>
      </div>
      <% end %>

      <br>

      <p class="devise-link">
        アカウントをお持ちですか?
        <%= link_to "ログイン", new_user_session_path %>
      </p>
    </div>
  </div>
</div>

カラムを追加するためのマイグレーションファイル

class AddNameToUser < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :name, :string, null: false
  end
end

ストロングパラメータの設定

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

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

Userモデルのバリデーション設定

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

         validates :name, presence: true, length: { maximum: 50 }
end

自分で試したこと

以下のことを行い、送信する値をemailとpasswordのみにしてみましたがうまくいきません。
・viewファイルからemailとpassword以外のフォームを除く
・nameカラムの追加をやめる
・ストロングパラメータの設定をやめる
・バリデーションをはずす

補足

それぞれのバージョンは以下のとおりです。
ruby
 2.6.8p205
rails
 6.1.4.1
bootstrap
 4.5.3

{
  "name": "colabo",
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "5.4.2",
    "bootstrap": "4.5.3",
    "jquery": "^3.6.0",
    "popper.js": "^1.16.1",
    "turbolinks": "^5.2.0",
    "webpack": "^4.46.0",
    "webpack-cli": "^3.3.12"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^4.2.0"
  }
}

1

3Answer

railsのサーバーを動かしていたらコンソールにログが表示されていると思いますが(またはlog/development.log)、

新規登録した際にエラーは出ないのですが、なぜかデータベースに保存されません。

この操作時のログを掲載できますか?

0Like

Comments

  1. @pinoko72447

    Questioner

    ご回答ありがとうございます。
    rails sをしたあとのコンソール画面は下のようになっていました。

    Use Ctrl-C to stop
    Started POST "/users" for ::1 at 2021-09-21 11:37:32 +0900
    (1.8ms) SELECT sqlite_version(*)
    (0.8ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
    Processing by Devise::RegistrationsController#create as HTML
    Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"inu@icloud.com", "name"=>"いぬ", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"登録する"}
    TRANSACTION (0.1ms) begin transaction
    User Exists? (1.1ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "inu@icloud.com"], ["LIMIT", 1]]
    TRANSACTION (0.1ms) rollback transaction
    Rendering layout layouts/application.html.erb
    Rendering devise/registrations/new.html.erb within layouts/application
    Rendered devise/registrations/new.html.erb within layouts/application (Duration: 20.6ms | Allocations: 3911)
    [Webpacker] Everything's up-to-date. Nothing to do
    Rendered partial/_navbar.html.erb (Duration: 1.9ms | Allocations: 503)
    Rendered partial/_footer.html.erb (Duration: 0.7ms | Allocations: 120)
    Rendered layout layouts/application.html.erb (Duration: 69.3ms | Allocations: 10976)
    Completed 200 OK in 499ms (Views: 78.3ms | ActiveRecord: 2.3ms | Allocations: 27043)

    画像が送信できず、見づらい形になっていて申し訳ありません。
User Exists? (1.1ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "inu@icloud.com"], ["LIMIT", 1]]
TRANSACTION (0.1ms) rollback transaction

rollback transactionが起きているので何らかのエラーがあるんだと思います。

Parameters: {
    "authenticity_token"=>"[FILTERED]", 
    "user"=>{
      "email"=>"inu@icloud.com", 
      "name"=>"いぬ", 
      "password"=>"[FILTERED]", 
      "password_confirmation"=>"[FILTERED]"
    }, 
  "commit"=>"登録する"
}

こうログにあるので、rails cでコンソールから直接Userを作ってエラーが出ませんか?

$ rails c
> user = User.new(email: ... name: ...)
> user.valid?
> p user.errors
0Like

Comments

  1. @pinoko72447

    Questioner

    ```
    user = User.new(email: "inu@gmail.com", name: "inu", password: "inu", password_confirmation: "inu")
    ```
    を実行してみると
    ```
    #<User id: nil, email: "inu@gmail.com", created_at: nil, updated_at: nil, name: "inu">
    ```
    と出ました。引き続きuser.valid?を入力して実行してみると
    ```
    User Exists? (0.8ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "inu@gmail.com"], ["LIMIT", 1]]
    => false
    ```
    と出ました。p user.errorsを入力してみると
    ```
    #<ActiveModel::Errors:0x00007ff0a6dbd140 @base=#<User id: nil, email: "inu@gmail.com", created_at: nil, updated_at: nil, name: "inu">, @errors=[#<ActiveModel::Error attribute=password, type=too_short, options={:allow_blank=>true, :count=>6}>]>
    => #<ActiveModel::Errors:0x00007ff0a6dbd140 @base=#<User id: nil, email: "inu@gmail.com", created_at: nil, updated_at: nil, name: "inu">, @errors=[#<ActiveModel::Error attribute=password, type=too_short, options={:allow_blank=>true, :count=>6}>]>
    ```
    と出ました。とりあえずエラーが出てることはわかりますが、これは一体どういったエラーなんでしょうか、??

エラーそのものが書いてありますよ。

         クラス名         オブジェクトID
#<ActiveModel::Errors:0x00007ff0a6dbd140 
  変数名とその内容
         クラス名
  @base=#<User
    属性とその値
    id: nil,
    email: "inu@gmail.com",
    created_at: nil,
    updated_at: nil,
    name: "inu"
  >, 
  変数名とその内容
          配列
  @errors=[
             クラス名
    #<ActiveModel::Error
      属性とその値
      attribute=password,
      type=too_short,
      options={
        :allow_blank=>true, 
        :count=>6
      }
    >
  ]
>

エラーの中身はエラーが起きた時に自分で読めるようにならないとデバックできないです。

0Like

Comments

  1. @pinoko72447

    Questioner

    パスワードが短すぎたんですね、、、!
    解決しました、本当にありがとうございます!!!!!!
    コンソールでエラーを読み取る方法、大変参考になりました。
    ありがとうございます!

Your answer might help someone💌