web-dev-qa-db-ja.com

Railsの保護されたプライベートメソッド

Ruby(public、protected、およびprivateメソッド)のメソッドの可視性は、 このブログ投稿 のような場所で十分に説明されています。しかし、Ruby上のRailsでは、フレームワークの設定方法が原因で、通常のRubyアプリケーションの場合とは少し異なるようです。では、Railsモデル、コントローラー、ヘルパー、テストなどで、保護されたメソッドまたはプライベートメソッドを使用するのが適切かどうかは?

Edit:これまでの回答に感謝します。 Rubyの保護とプライベートの概念は理解していますが、Railsアプリのさまざまな部分のコンテキスト内でこれらの種類の可視性が使用される典型的な方法の説明をもっと探しています。コントローラー、ヘルパー、テスト)。たとえば、パブリックコントローラーメソッドはアクションメソッドであり、アプリケーションコントローラーの保護されたメソッドは、複数のコントローラーがアクセスする必要がある「ヘルパーメソッド」に使用されます。

80
jrdioko

モデルの場合、パブリックメソッドはクラスのパブリックインターフェイスであるという考え方です。パブリックメソッドは他のオブジェクトで使用することを目的としていますが、保護/プライベートメソッドは外部から隠されています。

これは、他のオブジェクト指向言語と同じ方法です。

ために コントローラーと テスト、あなたが好きなようにしてください。 コントローラーと テストクラスは、フレームワークによってインスタンス化され、呼び出されるだけです(はい、理論的にはビューからコントローラーを取得できることを知っていますが、それを行うと、とにかく奇妙なことが起こります)。誰もこれらのものを直接作成しないので、「保護」するものは何もありません。

補遺/訂正:コントローラーの場合、「ヘルパー」メソッドを 保護された プライベートであり、アクション自体のみがパブリックである必要があります。フレームワークは、パブリックではないアクション/メソッドに着信HTTP呼び出しをルーティングしないため、ヘルパーメソッドはそのように保護する必要があります。

ヘルパーの場合、メソッドは常に「直接」呼び出されるため、メソッドが保護されているかプライベートであるかに違いはありません。

もちろん、物事を理解しやすくするために、これらすべてのケースで保護されているものにマークを付けることができます。

104
averell

保護とプライベートの違いはわずかです。メソッドが保護されている場合、定義するクラスまたはそのサブクラスのインスタンスによって呼び出される場合があります。メソッドがプライベートの場合、呼び出し元のオブジェクトのコンテキスト内でのみ呼び出すことができます。オブジェクトが呼び出し元と同じクラスであっても、別のオブジェクトインスタンスのプライベートメソッドに直接アクセスすることはできません。保護されたメソッドの場合、同じクラス(または子)のオブジェクトからアクセスできます。

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility

10
nunopolonia

メソッドに適用されるクラスの可視性(public/protected/private)のセマンティクスについてはよく知っているようです。私が提供できるのは、Rails=アプリで実装する方法の簡単な概要です。

保護されたメソッドをベースアプリケーションコントローラーに実装し、フィルターを介して任意のコントローラーから呼び出されるようにします(例:before_filter:method_foo)。同様に、すべてが継承するベースモデルのすべてのモデルで使用するモデルの保護されたメソッドを定義します。

3
Sasha

アクションはコントローラーのパブリックメソッドである必要がありますが、すべてのパブリックメソッドが必ずしもアクションであるとは限りません。 hide_actionのようなキャッチオールルートを使用している場合、または無効になっている場合は、 /:controller/:action/:id を使用できます(Rails 3 )その後、明示的なルートを持つメソッドのみが呼び出されます。

これは、コントローラインスタンスをLiquidテンプレートエンジンなどの他のライブラリに渡す場合に便利です。Liquidフィルタとタグでsendを使用する代わりに、パブリックインターフェイスを提供できるからです。

2
pixeltrix