1

我有一个使用 rails_admin、devise 和 cancan 运行的基本 Rails 应用程序。当用户单击客户端登录链接时,我正在使用 FancyBox 2 显示灯箱类型的登录模式窗口。除了当用户输入不正确的凭据时,它的行为与预期相同. 我有两个问题:

  1. 如果用户提交了不正确的凭据,如何使 FancyBox 2 模态窗口继续显示,并显示提示他们需要在模态窗口中重新输入凭据的 Flash 消息?
  2. 除非它位于 FancyBox 2 模式窗口中,否则我如何阻止用户访问 /users/sign_in 页面?现在,如果用户输入:www.example.com/users/sign_in,那么他们将进入完整页面进行登录。理想情况下,我希望它能够触发 FancyBox 2 模态窗口。

以下是相关文件:

应用程序/视图/布局/appliction.html.erb

<!DOCTYPE html>
<html>
<head>
   <title>Test App</title>
   <%= stylesheet_link_tag    "application", :media => "all" %>  
   <%= stylesheet_link_tag    "jquery.fancybox.css", :media => "all" %> 
   <%= javascript_include_tag "application" %>
   <%= javascript_include_tag "jquery.fancybox.js" %>
   <%= csrf_meta_tags %>
</head>
<body>

   <%= flash[:notice] %>
   <%= flash[:alert] %>

   <%= yield %>

<script>
   $(document).ready(function() {
      $('.fancybox').fancybox({
         'onStart': function() {
            $('#fancybox-outer').css({'background':'transparent'});
            $('#fancybox-bg-n,#fancybox-bg-ne,#fancybox-bg-e,#fancybox-bg-se,#fancybox-bg-s,#fancybox-bg-sw,#fancybox-bg-w,#fancybox-bg-nw')
               .css({'background-image':'none'});
         }
      })
   });
</script>

</body>
</html>

app/views/welcome/index.html.erb (root_path)

<h1>Test App</h1>

<% if user_signed_in? %>
<a href="app">Dashboard</a>
<% else %>
<a class="fancybox fancybox.ajax" href="users/sign_in">Client Login</a>
<% end %>

app/views/devise/sessions/new.html.erb

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) 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 "devise/shared/links" %>

路线.rb

TestApp::Application.routes.draw do
   get "welcome/index"
   resources :containers
   resources :scales
   devise_for :users
   mount RailsAdmin::Engine => '/app', :as => 'rails_admin'
   root :to => 'welcome#index'
end
4

1 回答 1

0
  1. 您可能想查看针对此问题的 ajax 解决方案。传递remote: true给表单应该这样做。查看https://github.com/plataformatec/devise#configuring-controllers以了解如何覆盖会话控制器,以便添加可用于显示错误消息的 js 模板。
  2. 您应该查看https://github.com/plataformatec/devise#configuring-routes,以便在用户尝试访问该登录 url 时将他们重定向到您的主页。我认为你可以只传递一个参数,你可以检查它来触发一个打开fancybox的javascript事件
于 2013-01-30T04:08:35.090 回答