Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Desive、ruby on Rails和异步登录_Ruby On Rails_Ruby_Ajax_Asynchronous_Devise - Fatal编程技术网

Ruby on rails Desive、ruby on Rails和异步登录

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

我正在使用Desive在Rails中创建一个登录系统,我希望登录是异步的。我想ajax是唯一的选择


如果是这样的话,这是怎么做到的?

查看这篇文章,看看它是否是你想要的

首先,您需要配置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是唯一的选择…编辑我的答案。很抱歉,最初的回答质量很差。