Ruby on rails Desive、ruby on Rails和异步登录
我正在使用Desive在Rails中创建一个登录系统,我希望登录是异步的。我想ajax是唯一的选择Ruby on rails Desive、ruby on Rails和异步登录,ruby-on-rails,ruby,ajax,asynchronous,devise,Ruby On Rails,Ruby,Ajax,Asynchronous,Devise,我正在使用Desive在Rails中创建一个登录系统,我希望登录是异步的。我想ajax是唯一的选择 如果是这样的话,这是怎么做到的?查看这篇文章,看看它是否是你想要的 首先,您需要配置designe以接受JSON请求,因为AJAX将发送JSON请求。进入config/initializers/design.rb并将xhr上的config.http\u authenticable\u更改为false,然后将config.navigational\u格式更改为等于[“*/*”,:html,:json
如果是这样的话,这是怎么做到的?查看这篇文章,看看它是否是你想要的 首先,您需要配置designe以接受JSON请求,因为AJAX将发送JSON请求。进入
config/initializers/design.rb
并将xhr上的config.http\u authenticable\u更改为false
,然后将config.navigational\u格式更改为等于[“*/*”,:html,:json]
接下来,您必须覆盖Desive 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
之后,您需要将您的用户模型映射到Desive资源。通过将以下内容添加到要使用Desive AJAX功能的控制器的应用程序助手或助手文件中,可以实现这一点
module ApplicationHelper
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
end
然后,您将不得不重定向Desive以使用您制作的控制器,而不是它自己的控制器。将routes.rb
文件更改为:
devise_for :users, :controllers => {sessions: 'sessions}
现在您需要更改您的登录表单。使用rails生成设备:视图生成设备视图。您应该为
帮助程序使用表单并包含参数
(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!')
如果你想在浏览器中实现异步,ajax是唯一的选择…编辑我的答案。很抱歉,最初的回答质量很差。