2011-09-11 44 views
0

Rails具有这些很酷的属性,它们似乎实际上是方法。例如:在Ruby中的类上创建属性

class SomeController < ApplicationController 

    before_filter :authenticate! 

end 

这些实际上叫什么,你将如何创建自己的?举例来说,在我的模型之一,我希望能够有一个选择的内部方法处理一些结果的动态属性:

class MyModel < ActiveRecord::Base 

    active_method :some_class_method 

end 

我将如何设置这个,所以我可以设置active_method这样的,是能够作为实例var访问active_method符号?

编辑的阐述:

所以给低于这个首发,我需要弄清楚如何界定“selected_method”,以便它定义了访问或实例变量如此“called_selected_method”呼叫“method_b”。

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行)时,它将传递给它的参数列表保存在一个类变量中,以便稍后可以使用该类的其他方法。这些方法可以是实例方法或类方法。不言而喻,'*维护参数列表*'部分是以使设计有意义的方式完成的。 – Swanand

回答

3

它实际上只是一个方法调用在类上定义的方法。 before_filter由红宝石Module提供,其混入ActionController

创建您的类似before_filter自己的方法是一样简单:

  1. Define a class method你的类
  2. 调用该方法在你的类的任何具体实现。

一些示例代码:

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

    some_function "foo" 
end 

如果你想抽象进一步,你可以把类方法的模块,然后include that module到您的类(ES)。

UPDATE:

关于你如何获得的some_function调用设置一个实例变量的类问,你不能,因为类方法可以在不影响该特定实例类。

我不得不怀疑,虽然...你正在编写一个方法,它只是作为你的其他方法的代理,并且将被硬编码到类定义中。这对你没有任何好处,只会让你的代码变得复杂。

+3

在rails 3中由'AbstractController :: Callbacks'提供。在这两种情况下,基本功能都来自'ActiveSupport :: Callbacks'。 – numbers1311407

+0

确实你是对的。因为答案并不特别重要,所以我删除了这部分内容。 – Chris

+0

+1。具体为答案的最后一段。 – Swanand