2016-08-18 1 views
2

ほとんどの場合、AJAXを使用して私のカスタムログインフォームで動作するDeviseを修正しました。私が実装しなければならないのは、ユーザが誤ってログインしようとするとAJAX経由でカスタムフォームにログイン失敗のタイプ(空白フィールド、不正確な資格など)に関するメッセージが届くことです。Rails and Devise - Ajaxを介してクライアントに悪いログインのフィードバックを送信します。

私はそうのように、工夫のためsessions_controller.rbで作成する方法を変更するだけで試してみました:

def create 
    super 
    respond_to do |format| 
     format.js 
    end 
    end 
end 

とセッションビューのcreate.js.erbでこのコードを置く:

$("#complete_error").text("<%= "#{flash[:alert]}" %>"); 
$("#incorrect-log").removeClass("hidden"); 

これはまったく機能しません。警告が生成されたかどうかをテストするコントローラにputs flash[:alert]を書き込んでも、結果は得られません。私はAJAXログインに関する他のガイドに従ってみましたが、ちょっと混乱していましたし、私が探していたものを正確に扱わない傾向もありました。

ログインが失敗した場合、ログインアラートを取得して終了する必要がある場合、クライアントに返信するにはどうすればよいですか?

EDIT:ログに

401権限エラー:

Started POST "https://stackoverflow.com/users/sign_in" for ::1 at 2016-08-18 22:38:42 -0400 
Processing by SessionsController#create as JS 
    Parameters: {"utf8"=>"✓", "user"=>{"login"=>"aasdfasdf", "password"=>"[FILTERED]"}, "commit"=>"Log in"} 
    User Load (0.3ms) SELECT `users`.* FROM `users` WHERE (lower(username) = 
    'aasdfasdf' OR lower(email) = 'aasdfasdf') ORDER BY `users`.`id` ASC LIMIT 1 
Completed 401 Unauthorized in 2ms (ActiveRecord: 0.3ms) 

セッションコントローラ:

class SessionsController < Devise::SessionsController 

    before_action :authenticate_user!, :only => [:control_panel] 

    # GET /resource/sign_in 
    def new 
    super 
    end 

    # POST /resource/sign_in 
    def create 
    super 
    respond_to do |format| 
     format.js 
    end 
    end 

    # DELETE /resource/sign_out 
    def destroy 
    super 
    end 

    def control_panel 
    # Control panel page 
    end 

end 
(? は、私は完全に作成する方法だけでなく、スーパーをオーバーライドする必要があります)

答えて

1

これを試しましたか?

console.log("<%= flash[alert] %>") #please review this in your inspect console browser (firebug) 

$("#complete_error").text("<%= escape_javascript(flash[:alert]) %>"); 

EDITこれを実現するものであるあなたは、スーパーのために呼び出す

https://github.com/plataformatec/devise/blob/v4.2.0/app/controllers/devise/sessions_controller.rb#L16

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 

監視員を

self.resource = warden.authenticate!(auth_options) 

が、これが実行され、(パスワードや電子メール悪事) は、あなたの行動は、次の2つの選択肢オーバーライド作用を有し、このCompleted 401 Unauthorized in 2ms (ActiveRecord: 0.3ms)

が作成生産や監視員のカスタムについて検討するrender nothing: true, status: 401

で終了して作成偽でいるとき何も印刷されていない

def create 
    self.resource = User.find_by_email(sign_in_params[:email]) 
    if self.resource and self.resource.valid_password?(sign_in_params[:password]) 
    set_flash_message!(:notice, :signed_in) 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with self.resource, location: after_sign_in_path_for(resource) 
    elsif self.resource.nil? 
    self.resource = resource_class.new(sign_in_params) 
    self.resource.errors.add(:email, I18n.t(:invalid_email, scope: [:devise, :failure], default: 'Invalid Email')) 
    render :new 
    elsif not self.resource.valid_password?(sign_in_params[:password]) 
    self.resource.errors.add(:password, I18n.t(:invalid_password, scope: [:devise, :failure], default: 'Invalid Password')) 
    render :new 
    end    
end 
+0

Warden strategy

を認証コンソールで誤ったログインでは、コンソール内の唯一のものは「http:// localhost:3000/users/sign_in 401(Unauthorized)」というエラーです。 –

+0

あなたはそれを何と考えていますか?あなたはsessionControllerをオーバーライドしますか? –

+0

セッションコントローラをオーバーライドしましたが、アラートにアクセスできないようで、JSを効果的にレンダリングしていないようです。 –

関連する問題