2012-12-17 2 views
1

Я пробовал много вещей, и я не могу решить эту проблему. Прежде всего, у меня есть форма частично внутри fancybox.Rails close fancybox on ajax request

это: * _form.html.erb *

<%= form_tag sessions_path , remote:true , id: "login_form" do %> 
<div class="field"> 
    <%= label_tag :email %> 
    <%= text_field_tag :email, params[:email] %> 
</div> 
<div class="field"> 
    <%= label_tag :password %> 
    <%= password_field_tag :password %> 
</div> 
    <div class="actions"><%= submit_tag "Inloggen" %></div> 
<% end %> 

я отправляю данные внутри этой формы с функцией JQuery из моих application.js

jQuery('#login_button').fancybox({ 
    type: 'ajax' 
}) 


jQuery('#login_form').submit(function() { 
    var data = jQuery(this).serialize(); 

     $.getJSON('sessions/new.js?callback=?&variable=loginData', { 
     loginData: data 
     }, function(data) { 

      if(data == 0){ 
       alert('Your account is not activated yet'); 
      } 
      if(data == 1){ 
       alert('Password incorrect'); 
      } 
      // login correct 
      if(data == 2){ 
       //$.fancybox.close(); 
       window.parent.jQuery.fn.fancybox.close(); 
      } 
     }); 

    return false; 
}); 

Проблема заключается в том, что я получаю нет обратной связи, когда Iam в fancybox. Если я проверяю консоль на запрос XHR, он отправляет данные, и я получаю соответствующий ответ, но fancybox не закрывается, и я не получаю никаких предупреждений.

Последнее, но не менее мои сеансы контроллер

def create 
@user = User.find_by_email(params[:email]) 

#if there is a user with that e-mail, is it activated? 
if @user 
    if @user.user_level != '1' 
    @response = 1 
    end 
end 

#check the login information with has_secure_password, user has to be activated 
if @user && @user.authenticate(params[:password]) && @user.user_level == '1' 
    session[:user_id] = @user.id 
    @response = 2 
else 
    @response = 0 
end 

respond_to do |format| 
    format.json { render :json => @response } 
end 

Как закрыть FancyBox если ответ равен 2? И как я могу показать пользователю, что их ввод неверен изнутри fancybox?

ответ

1
respond_to do |format| 
    format.js do 
    if @response == 2 
     render :js => "$('#fancybox-content').remove();" 
    end 
    end 
end 

Или создать create.js.erb:

# controller 
respond_to do |format| 
    format.js { } 
end 

# create.js.erb 

<% if @response == 2 %> 
    $('#fancybox-content').remove(); 
<% end %> 

Это базовый подход. Расширьте свой код, если вам нужно другое поведение при неудачном создании.

+0

Возможно, я ошибся с dom_id fancybox. Выясните другой, если он не работает.) –

+0

Спасибо! Это тоже работает btw: render: js => "$ .fancybox.close();" –