前提・実現したいこと
deviseを用いたユーザー管理機能の実装において、
新規登録とログインができるようにしたいです。
発生している問題・エラーメッセージ
新規登録・ログインページにおいて、
必要な値は入力できているのに、送信ボタンを押しても
そのページから静止したままでフォームがリセットされるだけです。
新規登録に至ってはデータベース(mysql)上に保存されません。
しかし、コンソール上から打ち込むと
保存できるので、不思議です。
エラーメッセージ
### 該当のソースコード ターミナル Started POST "/views" for ::1 at 2021-01-27 15:55:26 +0900 Processing by Devise::RegistrationsController#create as HTML Parameters: {"authenticity_token"=>"HbQsIs63cGEUpzK0jgf3P41wktGLlI+YCnEJjD3mwFanPRtsj5lic1UyFcSEj6bTDzn26e8qFagb1ywa5JGuIw==", "email"=>"test@softbank.co.jp", "encrypted_password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "name"=>"山田太郎", "profile"=>"各地を放浪するノマドワーカー", "occupation"=>"フリーランス", "position"=>"エンジニア", "commit"=>"新規登録"} Rendering devise/registrations/new.html.erb within layouts/application Rendered devise/registrations/new.html.erb within layouts/application (Duration: 5.0ms | Allocations: 6270) [Webpacker] Everything's up-to-date. Nothing to do Completed 200 OK in 30ms (Views: 23.5ms | ActiveRecord: 0.0ms | Allocations: 16491) ```Ruby on Rails ###ルーティング Rails.application.routes.draw do devise_for :views devise_for :users root to: "prototypes#index" end ###コントローラー class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? before_action :authenticate_user! private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :password, :name, :profile, :occupation, :position]) devise_parameter_sanitizer.permit(:sign_in, keys: [:email, :password]) end end ###モデル class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :name, presence: true validates :email, presence: true validates :occupation, presence: true validates :position, presence: true has_many :comments has_many :prototypes end ###マイグレーションファイル class DeviseCreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" t.string :name, null: false t.text :profile, null: false t.text :occupation, null: false t.text :position, null: false t.string :reset_password_token t.datetime :reset_password_sent_at t.datetime :remember_created_at end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true end end ###ビューファイル ######views/devise/registrations/new.html.erb <div class="main"> <div class="inner"> <div class="form__wrapper"> <h2 class="page-heading">ユーザー新規登録</h2> <%# 「モデル名」にはUserモデルであれば@userを渡しましょう。%> <%# 「新規登録機能へのパス」は、devise導入後にrails routesを実行してdevise/registrations#createへのパスを確認し、記載してください。 %> <%= form_with model: @user, url: view_registration_path, local: true do |f| %> <div class="field"> <%= f.label :email, "メールアドレス" %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password, "パスワード(6文字以上)" %><br /> <%= f.password_field :encrypted_password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation, "パスワード再入力" %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :name, "ユーザー名" %><br /> <%= f.text_field :name %> </div> <div class="field"> <%= f.label :profile, "プロフィール" %><br /> <%= f.text_area :profile, class: :form__text %> </div> <div class="field"> <%= f.label :occupation, "所属" %><br /> <%= f.text_area :occupation, class: :form__text %> </div> <div class="field"> <%= f.label :position, "役職" %><br /> <%= f.text_area :position, class: :form__text %> </div> <div class="actions"> <%= f.submit "新規登録", class: :form__btn, method: :post %> </div> <% end %> </div> </div> </div> ######views/devise/sessions/new.html.erb <div class="main"> <div class="inner"> <div class="form__wrapper"> <h2 class="page-heading">ユーザーログイン</h2> <%# 「モデル名」にはUserモデルであれば@userを渡しましょう。%> <%# 「ログイン機能へのパス」は、devise導入後にrails routesを実行してdevise/sessions#createへのパスを確認し、記載してください。 %> <%= form_with model: @user, url: view_session_path, local: true do |f| %> <div class="field"> <%= f.label :email, "メールアドレス" %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password, "パスワード(6文字以上)" %><br /> <%= f.password_field :encrypted_password, autocomplete: "current-password" %> </div> <div class="actions"> <%= f.submit "ログイン", class: :form__btn %> </div> <% end %> </div> </div> </div>
試したこと
・ルーティング、バリデーション、ストロングパラメータ、パス、httpメソッド等を確認したが
特に問題はなかった。
・ターミナルのコンソール上で下記コード打ち込んで保存すると
データベースに反映される。
・上記の結果、バリデーション・ストロングパラメーターに完全に問題はない、
ということが分かっただけだった。
・application_cotroller.rb内にbinding.pryを記述して処理を止めてみたが、
分かったのはparamsに問題ない、ということだけだった。
補足情報(FW/ツールのバージョンなど)
(ターミナル上)
@user = User.new(email: "test@rakuten.co.jp", password: 333333, name: "山田太郎", profile:"各地を放浪するノマドワーカー", occupation: "フリーランス", position: "エンジニア")
=> #<User id: nil, email: "test@rakuten.co.jp", name: "山田太郎", profile: "各地を放浪するノマドワーカー", occupation: "フリーランス", position: "エンジニア", created_at: nil, updated_at: nil>
[4] pry(main)> @user.save
(0.4ms) BEGIN
User Exists? (0.5ms) SELECT 1 AS one FROM users
WHERE users
.email
= BINARY 'test@rakuten.co.jp' LIMIT 1
User Create (0.5ms) INSERT INTO users
(email
, encrypted_password
, name
, profile
, occupation
, position
, created_at
, updated_at
) VALUES ('test@rakuten.co.jp', '$2a$12$rC0dj4kkno991UPW/tCcE.2vkpGEOI04Eq1wbDZsO9eQZ1ZXMDPfa', '山田太郎', '各地を放浪するノマドワーカー', 'フリーランス', 'エンジニア', '2021-01-27 07:06:29.781818', '2021-01-27 07:06:29.781818')
(1.4ms) COMMIT
=> true
あなたの回答
tips
プレビュー