2009-05-22 7 views

答えて

9

更新 - true explanation of protected/private in Rubyにリンクしている下記のコメントをご覧ください。それは確かに私のジャワ日から残された深い座り込みの偏見でした。私の答えに残っている唯一の重要な部分は、アクションではないコントローラメソッドがpublic(または少なくともあなたのルートはそれらを保護する必要があります)であってはならないということです。

単一テーブル継承は、protectedがモデル階層で役立つ場合の完全な例です。継承の最も一般的な用途の1つです。コントローラ層で

ApplicationControllerに定義されたヘルパーメソッドはprotectedとしてマークされなければならない - 彼らはprivateた場合、他のコントローラは、それらにアクセスすることはできないだろうが、彼らはpublic Railsのであればアクションとして扱います。

個人的には、私は、Railsアプリケーションでも、私の友人や同僚の多くより多くのクラス継承を使用しています。私はそれを頻繁に(そしてJavaの日から出てくるので)、私はprotectedのすべてのヘルパーメソッドが、クラスを拡張しようとする人(通常は自分)に自由を与えることを好む - 私が本当に本当に困っていない限り私はそれをprivateとマークします。 :)

+0

これはかなり意味があります。 (STIが何であるかはわかりません)。 –

+3

"ApplicationControllerで定義されたヘルパーメソッドは保護されたものとしてマークする必要があります - プライベートであれば、他のコントローラはそれらにアクセスできません" - fyi、これは間違っています。ここの例を参照してください:http://pastie.org/842898。 RubyのProtected/Privateは、継承ではなく、「自己」と受信者に関するものです。 "Javaなどの言語とは異なり、継承はRubyのメソッドの可視性を決定する際に絶対に使用されないことに注意してください。 - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –

+0

ありがとう、ヨルダン。あなたが正しい。私は少しのメモを追加しました。 –

0

私は単一テーブル継承

クラスPerson < AR ::基本 クラスの先生<人 calss学生<人

を持っていると私は学生と教師のための共通ですプライベートメソッドを実装するために保護されたメソッドを使用します:

免責事項:この機能を実装するには、act-as-paranoidとその他のプラグインがあります私はあなたにその事件を示すためにここで使用しますが、私はあなたのところに行くためにここで簡略化したより複雑な風景を持っています。

+0

fyi上記の例は正しく動作しません。問題なく 'Person.reject_leaves(...) 'を呼び出すことができます。ルビの 'public/protected/private'はキーワードではなく、 'self'の状態を変更する' self'メソッド呼び出しです。あなたは自分自身を変えるとき、あなたは「自己」を変えるからです。 reject_leaves'あなたはもはや 'protected'状態が設定されていません。 2番目の例( 'Prot2')のようなものが必要なものを得るためには、次のようにしてください:http://pastie.org/842952 –

関連する問題