2009-09-28 68 views
3

我想要一個過濾器之前像「must_have_permission_to_write」,當被調用時,如果用戶沒有寫權限渲染消息說「你不能這樣做!」並返回。rails:在過濾器之前插入和中斷

問題是我得到「只能呈現或重定向一次每個動作」當然... 我怎樣才能停止執行過濾器之前? 感謝

回答

3

我認爲最簡單的答案就是添加一個重定向並返回false您must_have_permission_to_write方法。

def must_have_permission_to_write 
    unless current_user.has_permission?(something) 
    redirect_to access_denied_path 
    return false 
    end 
end 

然後,創建地方拒絕訪問的動作,添加路由,並把任何你想要的模板。

+3

這個「並返回false」的東西似乎有點危險,可以用作模式。如果redirect_to返回nil,則返回nil。將「返回false」放在單獨的行上可能是更好的方法。 – tadman 2009-09-28 17:24:00

+0

良好的通話,在答案 – Ben 2009-09-28 19:22:33

+2

@tadman +1中修復,不幸的是它是一種根深蒂固到「Rails方式」的反模式。我想看到它也會消失。 – 2011-04-21 18:12:01

-1

只需添加and return,像做:

before_filter :must_have_permission_to_write 

def must_have_permission_to_write 
    redirect_to login_path and return unless current_user 
end 
+0

-1'return'將從方法中返回nil(而不是從它所調用的動作中),它不會執行任何操作。您必須從過濾器方法返回false。另外,請參閱tadman對本答案的迴應。 – 2011-04-21 18:13:38

0

有幾件事我注意到了有關的職位在這裏:

  • 調用渲染或重定向過濾器之前,將取消該操作。當Rails沒有這樣做時有一點,但據我所知,現在是自動的。我似乎無法找到這個在線的參考,有人請糾正我,如果我錯了。
  • 使用「和返回」是取消動作的好方法,如果您確實在動作中。在上面的例子中,方法被定義爲before過濾器(即單獨的方法)在方法結束時調用「並返回」,並沒有那麼有用。
  • 我不認爲你應該告訴某人「你不能這樣做」,那不是一個非常安全的做法。如果有人要求他們沒有權限的東西,答案應該是404。通過這樣的回答,你給這個「好奇」的人提供了太多的信息。
相關問題