2016-08-15 7 views
1

メソッドを呼び出すことができる人を制限する良いルビーの方法を探しています。この例は、レール環境内で発生しますが、レールに固有のものではありません。ルビーでメソッドを呼び出すことができる人を制限する方法

私は、フォルダ内のドキュメントの検索を処理するDocumentというモデルを持っています。私はPermissionsを扱うクラスを持っているので、フォルダは許可されています。大きく簡略化された形式の権限で文書を検索するためのインタフェースを公開します。

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メソッドがPermissionsのインスタンス以外で呼び出されないようにすることです。権限をどこでも呼び出すことができますが、すべての複雑なクエリロジックを明確に処理するメソッドがある場合は、複雑なクエリロジックを再作成する必要がありますが、アクセスしない限り呼び出すことはできません。 。

このようなことをする慣用的なルビーの方法は何ですか?許可はユーザーのセッションに格納されているので、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 

質問の一部が欠落しているかどうか不明です。

関連する問題