1

我有两种用户 - 护士和患者,并且想要设置登录,以便在欢迎/登陆页面上有两个按钮,它们为每种类型的用户打开一个带有登录表单的引导模式。我希望登录表单发送一个 AJAX 请求,这样如果有错误,它们就会显示在模式本身中。

我正在使用 Devise 进行身份验证,并为护士和患者设置了 2 个模型。最初,我设置了模式以加载new_nurse_session_path单击按钮的 url,修改默认设计登录表单以发送 AJAX 请求,使用自定义SessionsController处理新会话并发送回 JSON 回复,然后让 JS 代码捕获回复. 这个工作(尽管有一些问题如下)非常慢,因为它正在加载整个页面nurses/sessions/new.html.erb以及标题、导航栏等。

问题

  1. 虽然在模式中打开整个登录页面时 JS 代码正在捕获 AJAX 请求(如下面的代码所示),但如果我直接打开该页面,即使服务器正在发送正确的 JSON,也不会处理 AJAX 请求回来 - 我在这里做错了什么可能会导致这个问题吗?

  2. 为了避免在模态中加载整个新会话页面,我按照此处的说明进行操作https://github.com/plataformatec/devise/wiki/How-To:-Display-a-custom-sign_in-form-anywhere- in-your-app将表单置于模态中。我在这里面临的问题是如何创建帮助程序,以便它根据尝试登录的护士或患者来定义资源和设计映射。如果我为每个表单创建单独的自定义表单和模式,我在处理 AJAX 请求时会遇到与第一季度相同的问题。非常感谢我在这里可能做错的事情的帮助。

  3. 如果我在这里陷入困境,非常感谢以更好的方式实现上述功能的建议!谢谢!

使用的代码

登录表单,nurses/sessions/new.html.erb:

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name), 
    :html => {:id => "sign_in_nurse"}, :format => :json, 
    :remote => true) do |f| %>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

  <% if devise_mapping.rememberable? -%>
    <div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
  <% end -%>

  <div><%= f.submit "Sign in" %></div>
<% end %>

<%= render "nurses/shared/links" %>

Coffeescript 处理 AJAX 回复,nurses.js.coffee:

$("form#sign_in_nurse").bind "ajax:success", (e, data, status, xhr) ->
  if data.success
    window.location.replace(data.redirect)
  else
    alert('failure!')

会话控制器:

class SessionsController < Devise::SessionsController
  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => "sessions#failure")
    return 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, :redirect => stored_location_for(scope) || after_sign_in_path_for(resource)}
  end

  def failure
    return render :json => {:success => false, :errors => ["Login failed."]}
  end
end

生成模态的代码:

     <li><%= link_to image_tag('i_am_nurse.png', :size => "130x130"),
 new_nurse_session_path , :data => { :target => "#ajax-modal",  :toggle => "modal"} %></li>

引导模态 div:

<div id="ajax-modal" class="modal hide fade" tabindex="-1">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    </div>
    <div class="modal-body">
        <div class="modal-body-content"></div>
        <div class="ajax-loader"></div>
    </div>
    <div class='modal-footer'>
        <button type="button" data-dismiss="modal" class="btn">Close</button>
    </div>
</div>​
4

0 回答 0