2015-01-29 3 views
0

Rails (4.1)에서 devise로 ajax 모달 로그인을 시도하고 있습니다. 나는 그것이 작동하도록 할 수 없습니다. 내 로그에 불구하고 200 번으로 리다이렉트했다는 메시지에도 불구하고 로그인하고 아무 일도 일어나지 않습니다. 그런 다음 새로 고침을하고 로그인했습니다. 로그인 후 리디렉션되지 않는 이유는 무엇입니까? 도와 주셔서 미리 감사드립니다. 여기 Rails Devise Ajax Modal

모달 부분입니다 :

여기
<%= form_for(resource, as: resource_name, url: session_path(resource_name), :remote => true, :format => :json, class: 'sign-in') do |f| %> 

    <%= f.email_field :email, autofocus: true, placeholder: 'Email', class: "form-control center-block" %> 

    <%= f.password_field :password, placeholder: 'Password', autocomplete: "off", class: 'form-control center-block' %> 

    <%= f.submit 'log in', class: 'center-block btn btn-sp btn-lg'%> 
<% end %> 

가 SessionsController입니다 :

class SessionsController < Devise::SessionsController 

def create 
resource = warden.authenticate!(:scope => resource_name, :recall => "home#index") 
return sign_in_and_redirect(resource_name, resource) 
end 

def sign_in_and_redirect(resource_or_scope, resource=nil) 
scope = Devise::Mapping.find_scope!(resource_or_scope) 
resource ||= resource_or_scope 
sign_in(scope, resource) unless warden.user(scope) == resource 
return render :json => {:success => true, :redirect => after_sign_in_path_for(resource)} 
end 

def failure 
    return render :json => {:success => false, :errors => ["Login failed."]} 
end 
end 

그리고 여기에 자바 스크립트입니다 : 여기

$('.sign-in').bind('ajax:success', function(e, data, status, xhr){ 
    console.log(data); 
    if(data.success){ 
    $('box').prepend('<p>signed in<p>') 
    } else{ 
    console.log('didnt work') 
    $('box').prepend('<p>login failed</p>') 
    } 
}) 

서버 로그입니다

Started GET "/admin/accounts" for 127.0.0.1 at 2015-01-29 11:01:19 -0800 
Processing by Admin::AccountsController#index as JS 
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 6 ORDER BY "users"."id" ASC LIMIT 1 
Account Load (0.2ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 LIMIT 1 [["id", 1]] 
Account Load (0.7ms) SELECT "accounts".* FROM "accounts" ORDER BY "accounts"."organization" ASC 
Rendered admin/accounts/index.html.erb within layouts/suite (12.4ms) 
Rendered layouts/application.html.erb (11.2ms) 
Rendered layouts/privacy-terms.html.erb (0.1ms) 
Completed 200 OK in 38ms (Views: 33.6ms | ActiveRecord: 1.2ms) 
+0

Devise 경로는 어떻게 생겼습니까? Devise sessions # create가 (는) 생성 작업으로 이동하고 있습니까? 해당 작업에'binding.pry'를 던져보십시오. – evanbikes

+0

예 devise_for : users, : controllers => {등록 : '등록', 세션 : '세션', 비밀번호 : '비밀번호', 잠금 해제 : '잠금 해제'} – ChrisPalmer

답변

0

는 여기에 내가 무엇을 할 것이라고입니다 :

sessions_controller.rb

def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => "home#index") 
    sign_in_without_redirect(resource_name, resource) 
    @after_sign_in_path = after_sign_in_path_for(resource) 
end 

def sign_in_without_redirect(resource_or_scope, resource=nil) 
    scope = Devise::Mapping.find_scope!(resource_or_scope) 
    resource ||= resource_or_scope 
    sign_in(scope, resource) unless warden.user(scope) == resource 
end 

레일은 기본적으로 '생성'라는 뷰를 렌더링합니다. remote: true 양식을 제출하기 때문에 'create.js.erb'에서 자바 스크립트 뷰를 렌더링합니다. 다음과 같이 원하는 로직을 넣을 수 있습니다.

(function() { 
    window.location = "<%= @after_sign_in_path %>"; 
})(); 

그리고 나서 자바 스크립트 이벤트 리스너를 잊어 버릴 수 있습니다.