簡體   English   中英

如何在before_filter中響應ajax調用

[英]how to respond to an ajax call in before_filter

我寫了一個像這樣的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代碼或redirect_to新頁面。 在這兩種情況下,我需要在flash中存儲一些消息。

另外,javascript代碼很長,所以我需要把它放在一個文件中。 如何使用render:js在文件中執行javascript?

我認為,您應該返回客戶端將理解的json響應,而不是嘗試為客戶端執行javascript代碼。

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一樣干燥。

我認為使用rails'內置重定向是你正在尋找的。

def authenticate_user
  if request.xhr?
    flash[:alert] = 'Error'
    redirect_to user_sign_up
  else
   authenticate_user!
  end
end

這應該重定向並填寫flash消息

以下是導軌指南中的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM