如何在before_filter中响应ajax调用

时间:2012-03-28 15:06:51

标签: ruby-on-rails ajax

我写了一个像这样的before_filter:

def authenticate_user
  if request.xhr?
    flash.now[:alert] = 'Error'
    render :partial => "js_helpers/popover", :formats => :js
  else
    authenticate_user!
  end
end

但是,它没有按预期工作。日志文件显示:

  Rendered js_helpers/_popover.js.erb (0.1ms)
Filter chain halted as :authenticate_user rendered or redirected

js代码的功能是显示一个显示flash消息的弹出框。 但看起来js代码根本没有兴奋。

所以,我改变了方向:

def authenticate_user
  if request.xhr?
    flash.now[:alert] = 'Error'
    render :js => "window.location = '/users/sign_up'"
  else
    authenticate_user!
  end
end

相反,我想重定向到注册页面。

然而,仍有问题。闪光似乎不起作用

我如何实现目标:

当请求是ajax调用时,执行javascript代码或重定向到新页面。在这两种情况下,我需要在flash中存储一些消息。

另外,javascript代码很长,所以我需要把它放在一个文件中。如何使用render:js在文件中执行javascript?

1 个答案:

答案 0 :(得分:2)

我认为不应该尝试为客户端执行javascript代码,而应该返回客户端会理解的json响应。

def authenticate_user
  if request.xhr?
    render :json => { alert: 'Error', redirect: sign_up_path }, :status => 403
  else
    authenticate_user!
  end
end

在您的ajax调用中,捕获403状态代码,显示警报消息,并重定向到给定的URL。你应该能够将它作为403(或任何状态代码似乎最合适)的标准钩子,这样它就可以像before_filter一样干。