🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Devise

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

Ruby on Rails

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

1305閲覧

[Rails6]ユーザー情報をUPDATE後にログインセッションが切れるのを解消したい

jackson

総合スコア2

Devise

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

Ruby on Rails

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2021/03/21 11:00

編集2021/03/21 15:30

前提・実現したいこと

railsでQAサイトを作っています。
deviseでuserモデルを作成しユーザー編集画面を作っていますが更新したときになぜかサインアウトしてしまいます。

イメージ説明
ここで更新するを押すと

イメージ説明

上記のようにログインが切られログイン画面に遷移してしまいます。

最初はdeviseのデフォルトで使える/app/views/devise/registrations/edit.html.erbで作成していましたが現在は自分で新しくビューを作成しapp/views/users/edit.html.erbでユーザー編集画面を作っています。コントローラーも新しく作成しました。詳細は以下に記述しています。

関連しそうなソースコード

#####app/views/users/edit.html.erb

<div class="container mt-5"> <div class="row"> <div class="col-6 mx-auto"> <h2>編集</h2> <%= form_with(model: @user, local: true) do |f| %> <div class="form-group"> <label>ユーザー名</label> <%= f.text_field :username, class: "form-control"%> </div> <div class="form-group"> <label>メールアドレス</label> <%= f.text_field :email, class: "form-control"%> </div> <div class="form-group"> <label>自己紹介文</label> <%= f.text_field :profile, class: "form-control" %> </div> <div class="form-group"> <label>パスワード</label> <%= f.password_field :password, autocomplete: "new-password",class: "form-control" %> </div> <div> <%= f.submit class: "btn btn-success" %> </div> <% end %> </div> </div> </div>

#####app/controllers/users_controller.rb

def show @user = User.find(params[:id]) if @user != current_user redirect_to root_url end end def edit @user = current_user end def update @user = current_user if @user.update(user_params) redirect_to questions_path, notice: 'ユーザー情報を更新しました' else render :edit end end private def user_params params.require(:user).permit(:username, :email,:password,:profile) end

#####app/controllers/application_controller.rb

class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? before_action :authenticate_user! def after_sign_in_path_for(resource) questions_path end def after_sign_up_path_for(resource) questions_path end def after_sign_out_path_for(resource_or_scope) new_user_session_path end protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username, :image]) devise_parameter_sanitizer.permit(:account_update, keys: [:username,:image,:profile]) end end

####app/views/devise/registrations/new.html.erb(ログインページのコード)

<h2>Sign up</h2> <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= render "devise/shared/error_messages", resource: resource %> <div class="field"> <h7>名前</h7><br> <%= f.text_field :username %> </div> <div class="field"> <h7>メールアドレス</h7><br> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <h7>パスワード(6文字以上)</h7><br> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <h7>確認用パスワード</h7><br> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div class="actions"> <%= f.submit "Sign up" %> </div> <% end %> <%= render "devise/shared/links" %>

####app/controllers/users/sessions_controller.rb(deviseのコントローラ)

# frozen_string_literal: true class Users::SessionsController < Devise::SessionsController # before_action :configure_sign_in_params, only: [:create] # GET /resource/sign_in # def new # super # end # POST /resource/sign_in # def create # super # end # DELETE /resource/sign_out # def destroy # super # end # protected # If you have extra params to permit, append them to the sanitizer. # def configure_sign_in_params # devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute]) # end end

####routes.rb

Rails.application.routes.draw do devise_for :admin_users, ActiveAdmin::Devise.config ActiveAdmin.routes(self) resources :reactions get 'answers' => 'answers#index' resources :questions, shallow: true do resources :answers, shallow: true do resources :reactions end end devise_for :users, controllers: { omniauth_callbacks: 'omniauth_callbacks' , registrations: 'users/registrations', sessions: 'users/sessions' } get 'users/show', to: 'users#show' resources :users resource :user, except: [:new, :create, :destroy] root 'questions#index' get 'pages/index' get 'pages/show' get 'questions', to:'questions#index' end

試したこと

どこかでログアウトしてしまうコードがないか一通り見てみましたが見つかりませんでした。
また、色々検索しては見ましたが該当する物が見つかりませんでした。

追記

足りない情報などがあれば申し付けください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

・ログインページのコードとそのファイル名
・ログインに関するコントローラー
・route.rb
の内容を確認したいですがお見せいただけますか?

edit.html.erbを/app/views/devise/registrations/ではない別のところに作成されたとのことでしたので、new.html.erbについても別のところに作成されていて、それが原因でログインがうまくできていないのかな、と推測しています。

投稿2021/03/21 13:11

yoshi_10_11

総合スコア241

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

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

jackson

2021/03/21 15:27

はい、ページを更新いたしましたのでご覧ください! routes.rbなどはごちゃごちゃしてて見にくいかもしれません。
jackson

2021/03/21 15:41

ちなみにnew.html.erbについては/app/views/devise/registrations/で使っています! また何か足りない情報があれば追加します!
yoshi_10_11

2021/03/21 16:14

ありがとうございます。newについては問題なさそうですね。 user_controller.rbの params.require(:user).permit(:username, :email,:password,:profile) から:passwordを省いて編集した場合にはどうなりますか? passwordについては暗号化やらいろいろ処理が必要なので、deviseを通さずに単純なupdateをしてしまうとリダイレクトされてしまう可能性があります。 もし、これが原因であるならば、すなおに/app/views/devise/registrations/edit.html.erbを編集して対応したほうが実装しやすいとは思います。
jackson

2021/03/22 06:16

ありがとうございます!無事解決しました!助言通り、permitで指定した:passwordが悪さしていたようです。なのでパスワードの変更だけ/devise/registrations/edit.html.erbを使うように編集しました。 yoshi_10_11さんのおかげで次に進めます!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問