0

私はReact + Railsアプリケーションを持っていますが、私は認証にdeviseを使用しています。私は、確認期間が過ぎた後にログインしようとしているユーザーのためにカスタムエラーメッセージを生成しようとしています。ログイン中にユーザーがdeviseを使用して確認したかどうか確認してください

現在、ログインがブロックされていますが、ブロックされた理由を説明するカスタムエラーメッセージは表示されません。

マイsession_controller.rb

def create 

    if BANNED_EMAILS.include?(params["user"]["email"]) 
    render :status => 500, :json => { error: true, message: 'Your account has been suspended. Please contact us for more information.' } 

//I get an error `ActiveRecord::RecordNotFound (Couldn't find User)` when I try this even though the user has already signed up and exists in the database 

    elsif User.find_by_email!(params[:user][:email]).confirmed? == true 
    render :json => { error: true, message: 'Please confirm your registered email to access your account.'}, :status => 500 
    else 
    self.resource = warden.authenticate!(auth_options) 
    sign_in(resource_name, resource) 
    render :status => 200, :json => resource.to_json  
end 

エンド

ログインするか、同じエラーを表示しないためにいくつかの他の方法があるしようとしている利用者の情報を引き出すためにいくつかの他の方法はありますか?

+0

あなたは両方の電子メールとcaluseがdowncased WHERE'/ – Ruslan

+0

@Ruslanが正確にどのように私がすべきupcased '使用することができますwhere句に電子メールを書きますか?私は 'どこに'試みたが、多分私は属性を正しく渡さなかった – anonn023432

+0

あなたはどのデータベースを使用していますか? – Ruslan

答えて

1

でないならば、あなたはuser.confirmed?を試すことができますが、それが得られることがわかります。

class Devise::SessionsController < DeviseController 
    # POST /resource/sign_in 
    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message!(:notice, :signed_in) 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, location: after_sign_in_path_for(resource) 
    end 
end 

これにより、メソッド全体をオーバーライドすることなく、サブクラスがフローに入ることができます。代わりに、コードの定数を使用しての

class MySessionsController < DeviseController 
    def create 
    # taps into the yield right after the user is authenticated by warden 
    super do |user| 
     if user.banned? 
     # 500 is the wrong response code 
     # it means that the server is broken and cannot respond to the request 
     render json: { error: true, message: 'Your account has been suspended. Please contact us for more information.' }, 
      status: 401 and return 
     elsif user.requires_confirmation? 
     render json: { error: true, message: 'Please confirm your registered email to access your account.'}, 
      status: 401 and return 
     end 
    end 
    end 
end 

は(あなたは本当にアプリケーションにユーザーが禁止されるたびに再デプロイしようとしている?)あなたは、ユーザーが禁止されている場合を示すために、ユーザーテーブルにフラグを使用する必要があります。

同様に、ユーザが確認しなければならない時を決定するビジネスロジックはモデルレイヤで処理する必要があります。

class User < ApplicationRecord 
    # ... 
    def requires_confirmation? 
    if user.confirmed? || user.created_at < 3.days.ago 
     false 
    else 
     true 
    end 
    end 
end 
1

これを試してください。大文字と小文字を区別せずに電子メールでユーザーを検索しようとします。

user = User.where("upper(email) = '?'", params[:user][:email].upcase).first

あなたがDevise::SessionsController(または工夫コントローラのいずれか)を見ればusernil

関連する問題