質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

1回答

1430閲覧

Railsでdeviseを使用したら新規登録が出来なかった

TechOtome

総合スコア2

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

1グッド

1クリップ

投稿2021/08/20 07:39

編集2021/08/21 11:03

前提・実現したいこと

Railsでアプリを開発中、deviseを使ったユーザーの新規登録ができなくなったので解決したいです。
・アプリの開発当初にdeviseを導入したときは新規登録ができていました。
・いくつかの機能を実装したあと新規登録をしたら、ユーザー情報が保存されず、不具合に気づいたという状態です。
・devise導入時に登録したユーザー情報でのログインとログアウトは正常に動きます。

発生している問題・エラーメッセージ

新規登録ボタンを押したときのターミナルの表示。

・paramsには必要な情報が入っているのは確認しました
・最後の行にCompleted 200とありますが、DBには登録されていません
・登録実行後は、フォームが空になった状態で、再び新規登録画面が表示されます
・関係性があるのか分かりませんが、仮に空白のまま登録を実行してもエラーメッセージが出ません(ログイン画面では不備があるとエラーメッセージがちゃんと出ます・・・)

bash

1Started GET "/users/sign_up?authenticity_token=N2VDmmeLcnBlG2hasNQHZBW2zxChfMTvGcGhWwUhJne%2BLFaV9FeRVtunAIDhliyNRGvRFSTux6B2if5%2FVNomUw%3D%3D&user%5Bnickname%5D=%E3%83%86%E3%82%B9%E3%83%88%E6%AC%A1%E9%83%8E&user%5Bemail%5D=test2%40test.com&user%5Bpassword%5D=[FILTERED]&user%5Bpassword_confirmation%5D=[FILTERED]&commit=%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E7%99%BB%E9%8C%B2" for ::1 at 2021-08-20 16:19:30 +0900 2Processing by Devise::RegistrationsController#new as HTML 3 Parameters: {"authenticity_token"=>"N2VDmmeLcnBlG2hasNQHZBW2zxChfMTvGcGhWwUhJne+LFaV9FeRVtunAIDhliyNRGvRFSTux6B2if5/VNomUw==", "user"=>{"nickname"=>"テスト次郎", "email"=>"test2@test.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"アカウント登録"} 4 Rendering devise/registrations/new.html.erb within layouts/application 5 Rendered devise/shared/_links.html.erb (Duration: 0.3ms | Allocations: 108) 6 Rendered devise/registrations/new.html.erb within layouts/application (Duration: 3.8ms | Allocations: 1290) 7[Webpacker] Everything's up-to-date. Nothing to do 8Completed 200 OK in 26ms (Views: 24.7ms | ActiveRecord: 0.0ms | Allocations: 5183)

該当のソースコード

deviseの新規登録画面のビューです。
デフォルトから変更したのは、
・ニックネームカラムを追加している(ただし導入時から追加していて、そのときは正常に登録ができていた)
・bootstrapをdeviseにも導入している(ここが怪しいのかなと思いますが、理由を特定できていません)

views/devise/registrations.html.erb

ruby

1<form> 2<div class="col-7 m-auto devise_doby"> 3 <h3 class="title"><%= t('.sign_up') %></h3> 4 5 <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 6 <%= bootstrap_devise_error_messages! %> 7 8 <div class="form-group"> 9 <%= f.label :ニックネーム %> 10 <%= f.text_field :nickname, autofocus: true, autocomplete: 'nickname', class: 'form-control' %> 11 </div> 12 13 <div class="form-group"> 14 <%= f.label :email %> 15 <%= f.email_field :email, autocomplete: 'email', class: 'form-control' %> 16 </div> 17 18 <div class="form-group"> 19 <%= f.label :password %> 20 <%= f.password_field :password, autocomplete: 'current-password', class: 'form-control' %> 21 22 <% if @minimum_password_length %> 23 <small class="form-text text-muted"><%= t('devise.shared.minimum_password_length', count: @minimum_password_length) %></small> 24 <% end %> 25 </div> 26 27 <div class="form-group"> 28 <%= f.label :password_confirmation %> 29 <%= f.password_field :password_confirmation, autocomplete: 'current-password', class: 'form-control' %> 30 </div> 31 32 <div class="form-group"> 33 <%= f.submit t('.sign_up'), class: 'btn btn-primary' %> 34 </div> 35 <% end %> 36 <%= render 'devise/shared/links' %> 37 <%= link_to "トップページへ戻る", root_path, class: "text-blue" %> 38</div> 39</form>

参考:新規登録画面

下記のフォームを埋めて登録ボタンを押しても、空のフォームになった新規登録画面が表示されます。
イメージ説明

deviseの不具合に直面したことがなく、またエラー画面が出る訳でもないので、どう修正すれば良いのか分からず戸惑っています・・・
ヒントでも構いませんのでご意見をいただけたら幸いです。

追記1:ApplicationController

ruby

1class ApplicationController < ActionController::Base 2 before_action :configure_permitted_parameters, if: :devise_controller? 3 4 private 5 def configure_permitted_parameters 6 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) 7 end 8end

追記2:userモデル

本アプリでは同期通信のいいね機能が実装されています。
パスワードのバリデーションに関しては、devise導入時から記述していて、やはりその時は正常に処理されていました。

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 validates :nickname, presence: true 8 # passwordは半角英数字のバリデーション 9 validates :encrypted_password, :password, :password_confirmation, format: { with: /(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]/ } 10 11 has_many :events, through: :reaction_likes 12 has_many :reaction_likes, dependent: :destroy 13 # ユーザーがどの番組に「いいねをした」かを取得する 14 has_many :reaction_liked_events, through: :reaction_likes, source: :event 15 16 # ユーザーがすでにいいねをしているかどうかの判定をする。 17 def already_reaction_liked?(event) 18 self.reaction_likes.exists?(event_id: event.id) 19 end 20end
shinoharat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

J_O

2021/08/20 15:25

ApplicationControllerとuserモデルの追記をお願いします!
TechOtome

2021/08/21 11:05

コメントありがとうございます! 追記させていただきました。 どちらの記述もdevise導入時から変更していないはずなのですが、なぜ登録が出来なくなったのか・・・ 気づいたことを教えていただければ幸いです。ありがとうございます。
J_O

2021/08/22 07:02

挙動はバリデーションで引っかかったような挙動なので、一度エラーメッセージを取得できるかrails c 等で確認してみてください。
shinoharat

2021/09/09 05:16

新規登録ボタン押下時、本来なら POST 送信されて create アクションが呼ばれないといけないのですが、ログを見る限り GET 送信されて new アクションが呼ばれている気がします。 form 要素の method がどうなっているのか、ブラウザの開発者ツールで確認してみてはいかがでしょうか?
shinoharat

2021/09/09 05:17

あ、原因が分かりました。 回答を書きます。
TechOtome

2021/09/13 23:40

ご回答ありがとうございました。ご指摘の通り<form>タグの記述が不要でした。無事に新規登録ができております。本当にありがとうございました!!
guest

回答1

0

ベストアンサー

form_for が form 要素を自動で生成してくれるため、外側の form 要素は不要です。

erb

1<form> ← 不要 2 3 (中略) 4 5 <%= form_for(resource, ....) do |f| %> 6 7 (中略) 8 9 <% end %> 10 11 (中略) 12 13</form> ← 不要

余分な form 要素があるせいで、誤った URL & 誤った HTTP method に submit されてるんだと思います。

投稿2021/09/09 05:22

shinoharat

総合スコア1674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoharat

2021/09/09 05:50 編集

ちなみに、今回のご質問とは直接関係ないですが、バリデーションの書き方が気になりました。 -- 【1】 User モデルの format バリデーションについて、検証が必要なのは password, password_confirmation のみで、encrypted_password を検証する必要はない気がします。 -- 【2】 format 部分に \A \z が指定されていませんが、これで本当に意図したバリデーションになっているのでしょうか? 例えば、 "あいうabc123えお".match? /(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]/ は true になっちゃいます。 -- 【3】 末尾の [a-zA-Z\d] は『アルファベットまたは数字1文字』にマッチしますが、意図通りでしょうか? 『1文字』ではなく『1文字以上』にマッチさせる場合は、語尾に "+" を付けて [a-zA-Z\d]+ となります。
TechOtome

2021/09/14 00:22 編集

諸事情で返信に時間がかかってしまい申し訳ございません。 細かいご指摘まで本当にありがとうございます。まだまだ初学者ですが、このようなご親切な先輩方のおかげで大変助かっております。早くもっと成長して、私も初学者の方を助けられるように励みます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問