2017-04-08 128 views
0

我正在使用devise在Rails中創建登錄系統,並且我希望登錄是異步的。我認爲阿賈克斯是唯一的選擇?設計,ruby on Rails和異步登錄

如果是這樣,這是如何完成的?

+3

如果你想在瀏覽器中任何異步的AJAX是唯一的選擇... – max

回答

1

看看這篇文章,看看它是你在找什麼。 https://hackhands.com/sign-users-ajax-using-devise-rails/

首先,您要將Devise配置爲接受JSON請求,因爲這是AJAX發送的內容。進入config/initializers/devise.rb並將config.http_authenticatable_on_xhr更改爲false,然後將config.navigational_formats更改爲等於["*/*", :html, :json]

接下來,您將不得不覆蓋Devise Sessions控制器以使用JSON進行響應。你的會話控制器看起來應該像這樣:

class SessionsController resource_name, :recall => "#{controller_path}#failure") 
    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} 
    end 

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

之後,你需要將你的用戶模型映射到設計資源。您可以通過將以下內容添加到您希望使用Devise AJAX功能的應用程序幫助程序或控制器的幫助程序文件來實現此目的。

 module ApplicationHelper 
    def resource_name 
    :user 
    end 

    def resource 
    @resource ||= User.new 
    end 

    def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
    end 
end 

然後,你將不得不重定向Devise使用你所做的控制器,而不是自己的。更改您的routes.rb文件看起來像:

devise_for :users, :controllers => {sessions: 'sessions} 

現在你想改變你的登錄表單。使用rails generate devise:views生成Devise視圖。您應該使用form_for助手,包括參數

(resource, :as => resource_name, 
       :url => session_path(resource_name) , 
       :html => {:id => "sign_in_user"}, 
       :format => :json, 
       :remote => true) 

的看法如何看起來剩下的就看你。

最後,您需要包含Javascript才能捕獲服務器的AJAX響應。這是coffescript中的一個例子。

$("form#sign_in_user").bind "ajax:success", (e, data, status, xhr) -> 
    if data.success 
     $('#sign_in').modal('hide') 
     $('#sign_in_button').hide() 
     $('#submit_comment').slideToggle(1000, "easeOutBack") 
    else 
     alert('failure!') 
+1

編輯我的答案。對不起,最初質量差的答案。 – gtoledo