2016-08-15 20 views
1

我正在尋找一種好的ruby方法來限制誰可以調用方法。這個例子發生在rails環境中,但它並不特定於rails。如何限制誰可以調用ruby方法

我有一個稱爲文檔的模型,處理查找文件夾內的文檔。文件夾被許可,所以我有一個處理權限的類。在很大程度上簡化形式權限公開接口檢索文件:

class Permissions 
    def documents(folder_list) 
     #strip folders from folder_list user doesn't have permissions for 
     Document.where("folder.name in (?)", permissioned_folder_list) 
    end 
end 

功能能正常工作,但RSpec的測試是一個惡夢,當查詢比這簡單的例子要複雜得多。我們最終會得到很多關於如何存儲文檔的機制的期望。真的我想有更多這樣的東西:

class Permissions 
    def documents(folder_list) 
     #strip folders from folder_list user doesn't have permissions for 
     Document.documents(permissioned_folder_list) 
    end 
end 

class Document 
    self.documents(folder_list) 
     Document.where("folder.name in (?)", folder_list) 
    end 
end 

這將是很好的因素,易於測試。麻煩的是,現在在Document上提供了一個接口,它看起來像一個很好的域級接口,但完全繞過了權限。對於某個人來說,使用它很容易,並且獲得完全不正確的合理結果。

我想要做的是防止Document :: documents方法被除權限實例以外的其他任何東西所調用。它不是萬無一失的,因爲你仍然可以調用全部或者哪裏並繞過權限,但是當有一個方法可以清楚地處理所有對你的問題時,你必須重新創建所有複雜的查詢邏輯,但是除非你通過權限。

什麼是做這樣的事情的慣用ruby方式? BTW,因爲權限存儲在用戶的會話中,調用Document並讓它調用Permissions而不是調用Permissions並讓它調用Document是相當混亂的。

回答

0

private關鍵字是不是有足夠的理由?

你似乎不希望私人方法的另一個類。爲什麼不讓他們遵循private聲明的實例方法?

如果您需要從控制器以外的地方使用session,請將其作爲參數傳遞。

class Permissions 
    def documents(folder_list, session) 
     _documents(folder_list, session) 
    end 

    private 
    def _documents(folder_list, session) 
     Document.where("folder.name in (?)", folder_list) 
    end 
end 

不知道如果我錯過了你的問題的一部分。

相關問題