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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

3309閲覧

deviseで作成したのにログインできない

yume0409

総合スコア45

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/02/17 06:58

編集2020/02/18 08:20

deviseで実装したログイン機能が昨日はできていたのに何故か今日になってからログインできなくなりました。
ログインが失敗するとエラーメッセージを表示したかったのでコントローラーをカスタマイズしました。(カスタマイズしたのは一昨日です)
sessions_controller.rb

def new @user = User.new end def create @user = User.find_by(email: params[:email], password: params[:password]) if @user redirect_to :root else @error_message = "メッセージ" @email = params[:email] @password = params[:password] render "devise/sessions/new" end end

上記のコードでやるとメールアドレスとパスワードは絶対合っているのにエラーメッセージが出てログインできなくなります。

def new @user = User.new end def create @user = User.find_by(email: session_params[:email], password: session_params[:password]) if @user redirect_to :root else @error_message = "メッセージ" @email = params[:email] @password = params[:password] render "devise/sessions/new" end end private def session_params params.permit(:email, :password) end end

必要か分からないのですが、privateを付け足してみましたが、結果は同じでした。
find_byでif @user.saveにしてみたらノーメソッドエラーになります。(saveがnilになります)
find_byをcreateやnewに変えて、if @user.saveにしたらルートに遷移はされるのですが、
ログインはしていない状態になります。

ちなみにビューはこのようになっています。

.aaa %h2 ログイン = form_for(user_session_path) do |f| - if @error_message .message = @error_message .field = f.label :email %br/ = f.email_field :email, autofocus: true, autocomplete: "email", class: "bbb" .field = f.label :password %br/ = f.password_field :password, autocomplete: "current-password", class: "ccc" - if devise_mapping.rememberable? .field = f.check_box :remember_me = f.label :remember_me .actions = f.submit "ログイン", class: "ddd"

これはdeviseを作成してからほとんど触っていません。
上から6行目までと各フィールドのクラス名のみ触りました!
昨日はこの記述でもログインできていたと思うのですが…原因が分からないので、ご回答よろしくお願いします。

#補足
ログインビューの2行目を

= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|

と変えてみました。
ログインボタンを押すと

ArgumentError in Users::Sessions#create First argument in form cannot contain nil or be empty

エラー出るのですが、エラー出た後に

= form_for(user_session_path) do |f|

に戻すと何故かエラーがなくなり、再度ログインするとログイン出来るようになりました。
しかし、再びログアウトをするとログインは出来なくなっています。
こう言う現象は何故でしょうか?
コントローラー、ビューの記述自体はほぼ問題なさそうでform_forに問題ありそうな気がしています。。。

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

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

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

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

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

guest

回答2

0

そもそもメソッドを完全にオーバーライドしてしまっているのがよくないです。
それであればDeviseを使う意味がないのではないですか?
よほどの理由により意図的なのであれば問題ないのですが、見た感じ完全にそれが原因な気がします。
上書きするのは必要最低限に留め、最後に親クラスのメソッドを呼び出してみてはどうでしょうか?

投稿2020/02/17 07:57

Mugheart

総合スコア2349

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

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

0

User.find_by(email: 。。。, password: 。。。)
がそもそもおかしいです。ここでエラーにならない?
DBにはpasswordは登録してありません。暗号化したencripted_password です。
ですので、このfindは必ずnilが返ります。

deviseのcontrollerに手を入れるのでしたら、codeをcopyしてからそこを修正するようにしましょう

投稿2020/02/17 07:27

winterboum

総合スコア23549

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

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

yume0409

2020/02/17 07:44

回答ありがとうございます。 すみません。 全て同じコードを載せれないのでencryptedを消していました。 本当はencrypted_passwordにしてあります。。。 ちなみに、今日encrypted_passwordと気づいて直したのですが、直す前と直した後、エラーは変わらなかったと思います。
winterboum

2020/02/17 08:24

正しい質問をしないと正しい答えは得られません。 いずれにしても、元のcodeも見ずに置き換えるのは関心出来ません。 Deviseがいろいろ設定しているのがなしになるのですから。 class Users::SessionsController < Devise::SessionsController とdeviseを継承し、かつoriginalのcreateをcopyして、そこから直してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問