在AJAX表单提交后,Rails 3应用程序不会重定向

时间:2011-02-23 19:37:38

标签: ruby-on-rails ajax ruby-on-rails-3 authlogic

我有一个带:remote => true的Authlogic登录表单,如果用户/密码无效,可以使用RJS模板进行一些内联​​验证。这样可以正常工作,但是当凭据 有效时,它无法正确地重定向到别处。

这是响应表单输入的控制器:

class UserSessionsController < ApplicationController
  respond_to :html, :js

  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => :destroy

  def new
    @user_session = UserSession.new
  end

  def create
    @user_session = UserSession.new(params[:user_session])

    respond_to do |format|
      if @user_session.save     
        flash[:notice] = "Login successful!"
        format.html { redirect_to account_url }
      else
        format.js
      end
    end
  end

  def destroy
    current_user_session.destroy
    flash[:notice] = "Logout successful!"
    redirect_to root_path
  end

end

format.js部分有效但如果用户/密码良好(format.html),则不会发生任何事情。但是,如果我查看development.log,则 请求account_url页面。它不会在浏览器中重定向您。我认为它通过AJAX返回帐户页面,我真的只想要一个正常的重定向。

表单的HTML是:

<%= simple_form_for(
:user_session, @user_session, 
:url => { :controller => 'user_sessions', :action => "create" },
:html => { :id => 'login-dropdown' }, :remote => true) do |f| %>

3 个答案:

答案 0 :(得分:8)

我找到了解决问题的方法。每http://www.ruby-forum.com/topic/168406#945053,我将以下内容添加到应用程序控制器中:

def redirect_to(options = {}, response_status = {})
  if request.xhr?
    render(:update) {|page| page.redirect_to(options)}
  else
    super(options, response_status)
  end
end

这可以防止重定向响应通过xhr传递。如果在控制器中有更“正确”的方法,我想听听它。

答案 1 :(得分:0)

你可以这样做:

在application.js

$(document).ready(function(){
    $(document).ajaxError( function(e, xhr, options){
    if("401" == xhr.responseText)
    {
       $(location).attr('href','/users/sign_in');
    }
  });
}) 

和控制器的方法有以下代码:

respond_to do |format|
    format.html {redirect_to @new_user_session_url}
    format.js { render :text=>'401' ,:status=>401}
end

但我认为还有更好的方法......

答案 2 :(得分:0)

app
 views
   user_sessions
     create.js.erb(create file this)
在您的创建操作中

添加此代码

 def create
  @user_session = UserSession.new(params[:user_session])

respond_to do |format|
  if @user_session.save     
    flash[:notice] = "Login successful!"
    @url = account_url
  end
 format.js
end

在你的“create.js.erb”

window.location.replace(<%= @url %>);