设计 - 使用Ajax登录

jme*_*idt 8 ruby ajax devise warden ruby-on-rails-4

有没有可能修改设备SessionsController进行ajax通信?

编辑

我找到了解决方案,并将其发布到答案中,谢谢

jme*_*idt 43

1.生成Devise控制器,以便我们对其进行修改

rails g devise:controllers
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我们在app/controllers/[model] 目录中拥有所有控制器

2.编辑routes.rb

让我们设置Devise来使用我们修改过的SessionsController

首先将此代码(当然是更改:用户到您的设计模型)添加到config/routes.rb中

devise_for :users, controllers: {
  sessions: 'users/sessions'
}
Run Code Online (Sandbox Code Playgroud)

3.修改sessions_controller.rb

在此输入图像描述

找到create方法并将其更改为

def create
  resource = User.find_for_database_authentication(email: params[:user][:email])
  return invalid_login_attempt unless resource

  if resource.valid_password?(params[:user][:password])
    sign_in :user, resource
    return render nothing: true
  end

  invalid_login_attempt
 end
Run Code Online (Sandbox Code Playgroud)

保护后创建新方法

def invalid_login_attempt
  set_flash_message(:alert, :invalid)
  render json: flash[:alert], status: 401
end
Run Code Online (Sandbox Code Playgroud)

4. devise.rb

将其插入config/initializers/devise.rb

config.http_authenticatable_on_xhr = false
config.navigational_formats = ["*/*", :html, :json]
Run Code Online (Sandbox Code Playgroud)

5.无效的电子邮件或密码消息

会话下的config/locales/devise.en.yml中插入新消息

invalid: "Invalid email or password."
Run Code Online (Sandbox Code Playgroud)

会议

6.查看

= form_for resource, url: session_path(:user), remote: true do |f|
  = f.text_field :email
  = f.password_field :password
  = f.label :remember_me do
    Remember me
    = f.check_box :remember_me
  = f.submit value: 'Sign in'

:javascript
  $(document).ready(function() {
    //form id
    $('#new_user')
    .bind('ajax:success', function(evt, data, status, xhr) {
      //function called on status: 200 (for ex.)
      console.log('success');
    })
    .bind("ajax:error", function(evt, xhr, status, error) {
      //function called on status: 401 or 500 (for ex.)
      console.log(xhr.responseText);
    });
  });
Run Code Online (Sandbox Code Playgroud)

重要的事情远程:真的

我使用状态200或401而不是{status:'true'}的原因是数据量较小,因此速度更快,更清晰.

说明

登录时,您可以使用参数获取这些数据

action: "create"
commit: "Sign in"
controller: "users/sessions"
user: {
  email: "test@test.cz"
  password: "123"
  remember_me: "0"
}
utf8: "?"
Run Code Online (Sandbox Code Playgroud)

签名之前,您需要授权用户.

resource = User.find_for_database_authentication(email: params[:user][:email])
Run Code Online (Sandbox Code Playgroud)

User.find_for_database_authentication

如果找到用户,资源将填充类似的东西

created_at: "2015-05-29T12:48:04.000Z"
email: "test@test.cz"
id: 1
updated_at: "2015-06-13T19:56:54.000Z"
Run Code Online (Sandbox Code Playgroud)

否则就会

null
Run Code Online (Sandbox Code Playgroud)

如果用户已通过身份验证,我们即将验证其密码

if resource.valid_password?(params[:user][:password])
Run Code Online (Sandbox Code Playgroud)

最后登录

sign_in :user, resource
Run Code Online (Sandbox Code Playgroud)

来源

SessionsController

帮助我 安德烈亚斯林斯塔德

  • 我在SO上看到的最佳答案之一.做得好. (3认同)