Сохранение модального окна открытым после неудачной попытки входа в приложение Rails с использованием FancyBox 2

У меня есть базовое приложение Rails, работающее с rails_admin, devise и cancan. Я использую FancyBox 2 для отображения модального окна входа в систему в виде лайтбокса, когда пользователь щелкает ссылку входа в систему. Он ведет себя так, как хотелось бы, за исключением того, что когда пользователь вводит неверные учетные данные, пользователь затем перенаправляется на /users/sign_in вместо того, чтобы просто снова открыть эту страницу в модальном окне с флэш-сообщением о том, что имя пользователя или пароль неверны. . У меня есть два вопроса:

  1. Как я могу заставить модальное окно FancyBox 2 продолжать отображаться, если пользователь отправляет неправильные учетные данные, и отображать флэш-сообщение о том, что им необходимо повторно ввести свои учетные данные в модальном окне?
  2. Как я могу запретить пользователям переходить на страницу /users/sign_in, если она не находится в модальном окне FancyBox 2? Прямо сейчас, если пользователь введет: 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 %>

приложение/представления/устройства/сеансы/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

person Lee Graham    schedule 30.01.2013    source источник


Ответы (1)


  1. Вы можете посмотреть решение ajax для этой проблемы. Передача remote: true в форму должна сделать это. Посмотрите на https://github.com/plataformatec/devise#configuring-controllers, как чтобы переопределить контроллер сеансов, чтобы вы могли добавить шаблон js, который вы можете использовать для отображения сообщений об ошибках.
  2. Вы должны посмотреть на https://github.com/plataformatec/devise#configuring-routes так что вы можете перенаправлять пользователей на свою домашнюю страницу, когда они пытаются перейти по этому URL-адресу для входа. Я думаю, вы можете просто передать параметры, которые вы можете проверить, чтобы вызвать событие javascript, которое открывает fancybox.
person jvnill    schedule 30.01.2013