使用ajax登录设计多个模型,bootstrap模式

时间:2013-04-22 19:44:39

标签: ajax twitter-bootstrap devise ruby-on-rails-3.2 multiple-models

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

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

问题

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

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

  3. 如果我要在这里挖洞,我会非常感谢以更好的方式实施上述功能的建议!谢谢!

  4. 使用的代码

    登录表格,护士/会话/ 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!')
    

    SessionsController:

    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>
    

    Bootstrap模态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>​
    

0 个答案:

没有答案