2010-09-04 28 views
20

我有下面這段代碼如何阻止軌道控制器執行?

def show 
    unless logged_in? 
     login_required 
     return 
    end 
    #some additional code 
    #that should only execute 
    #if user is logged in 
end 

這完美的作品。 現在我想將登錄檢查移到過濾器之前。 問題是,當我從show以外的方法返回時,它不會停止show的執行...我如何停止show從外部方法(即可以調用的方法從之前的過濾器)?

謝謝!

回答

16

如果您從before_filter返回false,則請求的執行將立即停止。

如果你只是讓你的login_required方法返回假(或重定向),如果他們沒有登錄,並使其返回true,那麼只是before_filter :login_required,它應該完美工作。

編輯:Lenry如下聲明,這不會在Rails的工作2.0.1+ 相反,停在你的代碼

+0

完美。謝謝! – 2010-09-04 23:25:09

+0

這不再有效。檢查下面Lenny的答案。 – tdgs 2013-02-28 17:08:28

17

在請求中使用head :ok軌2.0.1版本及以上,你需要重定向或發送響應以停止執行該動作。

Agile Web Development with Rails Errata

#45840:以下是不正確:

「如果一個過濾器返回的過濾器鏈終止的假的,處理之前,並且該動作被不運行的過濾器可也會渲染輸出或重定向請求,在這種情況下,原始動作永遠不會被調用。「

before_filter不會停止在返回false時處理過濾器鏈。

從Rails的2.0.1版本說明: *改變的before_filter制止發生在自動渲染或重定向,但不再簡單地返回false [戴維·海因梅耶爾·漢臣]

--Rob克里斯蒂

redirect_to,renderhead將全部停止執行。例如,head :ok將僅響應具有OK HTTP響應代碼的請求,並且該操作將不會執行。

+6

除非'render'調用在過濾器鏈中,否則對'render' *的調用不會*停止控制器動作的執行。 (http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors) – pje 2013-02-18 23:17:04

+3

如果渲染暫停執行,如果渲染兩次,爲什麼會出現雙渲染錯誤? – Mohamad 2013-04-19 16:01:16

+4

這裏的重要區別是必須從'before_filter'中調用3個方法才能停止執行。 – maletor 2013-11-27 22:06:21

1

要停止回調鏈中的Rails 5可以使用

throw :abort 
+3

我不明白最好的地方在哪裏,來抓住這個拋出的符號。如果我想介紹一些所有控制器通用的邏輯,這會阻止進一步的處理,並且我在'ApplicationController'中拋出':abort',我在哪裏捕獲它? – sameers 2016-11-18 02:29:03

+0

thow:abort僅用於模型驗證而不是控制器。 – bkunzi01 2017-04-11 17:31:33