如何在before_filter中响应ajax调用

Han*_*nXu 7 ajax ruby-on-rails

我写了一个像这样的before_filter:

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

但是,仍然存在问题.闪光似乎不起作用

我怎样才能实现我的目标:

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

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

soc*_*onk 2

我认为,您应该返回客户端能够理解的 json 响应,而不是尝试呈现 javascript 代码以供客户端执行。

def authenticate_user
  if request.xhr?
    render :json => { alert: 'Error', redirect: sign_up_path }, :status => 403
  else
    authenticate_user!
  end
end
Run Code Online (Sandbox Code Playgroud)

在 ajax 调用中,捕获 403 状态代码、显示警报消息并重定向到给定的 url。您应该能够将其作为 403(或任何看起来最合适的状态代码)的标准挂钩,以便它可以像 before_filter 一样干燥。