2017-04-08 90 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