2011-09-11 13 views
0

Railsには、実際にメソッドであるように見えるクールなプロパティがあります。たとえば、Rubyのクラスのメソッドとしてプロパティを作成する

class SomeController < ApplicationController 

    before_filter :authenticate! 

end 

これらは実際には何と呼ばれ、独自のものを作成しますか?例えば、私のモデルの一つで、私はいくつかの結果を処理するための内部方法を選択し、動的性質を持つことができるようにしたい:

class MyModel < ActiveRecord::Base 

    active_method :some_class_method 

end 
私はので、私はそのよう active_methodを設定し、することができ、これを設定する方法を

active_methodシンボルにインスタンスvarとしてアクセスできますか?精緻化のための

編集:

ので、以下、このスターターを与え、私は「called_selected_methodは」「method_b」と呼ぶように、それはアクセサまたはインスタンス変数を定義するように、「selected_method」を定義する方法を理解する必要があります。

class MyClass 

    selected_method :method_b 

    def call_selected_method 

    end 

    private 

    def method_a 
    puts 'method_a' 
    end 

    def method_b 
    puts 'method_b' 
    end 

end 

c = MyClass.new 
c.call_selected_method # should put 'method_b' 
+0

詳しいことはできますか?あなたが言うプロパティは、実際には「実際にはメソッド」ですか? 'before_filter'について話していますか? –

+1

Chrisが言ったように、 'before_filter'は継承を介して' SomeController'に利用可能なクラスメソッドです。 'before_filter'が呼び出されると(コードの3行目)、クラス変数に渡された引数のリストが保持され、後でそのクラスの他のメソッドで使用できるようになります。これらのメソッドは、インスタンスメソッドまたはクラスメソッドです。 '*引数のリストを保持する*'の部分は、設計理にかなった方法で行われることは言うまでもない。レール3にある – Swanand

答えて

3

それは実際にクラスで定義されたメソッドにちょうどメソッド呼び出しです。 before_filterは、ルビーModuleによって提供され、これはActionControllerに混合されています。あなたのクラスにあなたのクラスのいずれかの具体的な実装で

  • 呼び出し、そのメソッド

    1. Define a class methodbefore_filterに似

      作成独自のメソッドは、同じように簡単です。

    いくつかのサンプルコード:

    class MyClass 
        class << self 
        def some_function(*args) 
         # your code here 
        end 
        end 
    
        some_function "foo" 
    end 
    

    あなたはさらに抽象化し、それを望んでいた場合は、モジュールにクラスメソッドを入れ、その後、自分のクラスに内include that module(複数可)することができます。

    UPDATE:クラスメソッドは、その特定のインスタンスに影響を与えることができないとして、あなたのクラスのインスタンス変数を設定するsome_functionの呼び出し、あなたがすることはできませんを取得する方法のあなたの提示に関連して

    クラス。

    私は疑問に思っていますが、あなたは他のメソッドのプロキシとして機能し、クラス定義にハードコードされるメソッドを作成しています。これはあなたにとって有益なことではなく、コードを重複して複雑にするだけです。

  • +3

    は 'AbstractController :: Callbacks'によって提供されています。どちらの場合も、基本機能は 'ActiveSupport :: Callbacks'から来ます。 – numbers1311407

    +0

    本当にあなたは正しいです。答えは特に重要ではないので、私はその部分を削除しました。 – Chris

    +0

    +1。具体的には、答えの最後の段落です。 – Swanand

    関連する問題