加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 设计Ajax登录:’sessions#create’仅在成功时

发布时间:2020-12-17 04:01:40 所属栏目:百科 来源:网络整理
导读:我的目标是使用Devise实现Ajax登录解决方案,并尽可能减少模式的变化.我已经部分达到了它,但是故障回调存在一个问题.让我解释一下这个场景: 使用remote显示模式中的登录表单:true Rails / UJS约定(OK); 创建自定义会话控制器并指向Devise(OK); 创建一个JS视
我的目标是使用Devise实现Ajax登录解决方案,并尽可能减少模式的变化.我已经部分达到了它,但是故障回调存在一个问题.让我解释一下这个场景:

>使用remote显示模式中的登录表单:true Rails / UJS约定(OK);
>创建自定义会话控制器并指向Devise(OK);
>创建一个JS视图文件create.js.erb来响应会话#create action(PROBLEM);

问题:我的create.js.erb只包含一个警报(“测试正常”).当我使用正确的凭据提交会话#new表单时,执行文件create.js.erb,将显示警报.但如果凭证错误,则返回401 Unauthorized status并忽略create.js.erb.

也许有人知道在登录失败时使create.js.erb运行的快速技巧.这样我就不需要创建独立的Ajax脚本或更改整个会话控制器.

谢谢,

环境:

VERSIONS:
Rails 4.0.2
Devise 3.2.2

定制会话控制器:

class Website::SessionsController < ::Devise::SessionsController
  respond_to :js # without it neither on success create.js.erb runs
  layout false   # action `new` pure html which is rendered in a modal box
end

会议/ create.js.erb

alert("Test ok");

登录失败时的服务器日志:

Started POST "/users/sign_in" for 127.0.0.1 at 2014-03-27 09:59:47 -0300
Processing by Website::SessionsController#create as JS
  Parameters: {"utf8"=>"?","user"=>{"email"=>"","password"=>"[FILTERED]"},"commit"=>"Fazer login"}
Completed 401 Unauthorized in 1ms

解决方法

出现问题的原因是:

warden.authenticate!(…)

它会引发异常并且不会渲染您的视图.

您应该为自己的行为覆盖SessionsController #create动作.例如这样:

def create
  self.resource = warden.authenticate(auth_options)
  if resource && resource.active_for_authentication?
    ...
    sign_in(resource_name,resource)
    ...
  else
    ...
  end
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读