从Ruby类中调用方法? (或者这是铁路魔术)

我是Ruby的新手,并且正在学习一些教程/截屏video。 我已经到达了他们讨论before_filter回调的部分,并且它使用了一些对我来说有点奇怪的语法。 我不知道它是否是ruby的特征,如果它是一些铁轨魔法,并希望有人在这里可以让我直接或指向我正确的方向w / r / t手册

这是我正在观看的截屏video的代码片段

 class MachinesController  [:report] #... def index #etc... end def login_required #etc... end end 

在rails的上下文中,我理解before_filter是一个回调函数,它会在调用report操作时触发login_required方法。 但是,我不清楚在ruby的背景下它是什么。 在其他语言中,类通常包含在大括号内定义的方法,属性,类变量和常量。

但是,这看起来像是在类中的函数调用,并且一些实验表明您可以将代码放在类定义中并在程序运行时调用它。 它是否正确? 如果是这样,是否有特殊的上下文规则用于将内联放入类中的代码? (即,rails中的before_filter函数是否知道它是从哪个类调用的)如果不是,那么rails在这里做了什么魔术?

before_filter实际上并不是一个回调。 它是ActiveRecord::Base的类方法,在您调用它时设置回调。 所以在这个例子中:

 before_filter :login_required, :only => [:report] 

加载类时,将调用该方法,并将:login_required添加到report方法的filter链中。

这些类型的调用的约定是删除parens,但如果你这样做,它会工作得很好(并且可以更容易识别为方法调用):

 before_filter(:login_required, :only => [:report]) 

与其他一些语言不同,在Ruby中,可以在运行时修改类,也可以在类定义中进行函数调用。 所以在这种情况下发生的是你正在调用before_filter函数,然后函数在运行时修改MachinesController类定义。

这是一种机制,它允许你使用Rails获得非常漂亮(至少我的眼睛)的语法,它几乎看起来你正在使用某种领域特定语言来描述你的模型。 类似于模型类的validateshas_manybelongs_to函数调用。

我的理解是,这被称为宏,属于元编程的保护伞。 您可以阅读有关此主题的更多信息 。

Ruby非常酷。 您绝对可以从类块中发送消息。 据我所知,除了显而易见的事情之外, class所做的事情是控制self的身份。 因此,您应该能够从那里调用该类的任何方法或包含的模块。

我不确定你的问题是什么,但这是我的解释:

 before_filter 

这是一个类方法调用,请参阅ActionController

 :login_required 

这是before_filter方法的参数,并用作使用Object#send的回调

 :only => [:report] 

这是before_filter的另一个Hash参数,再次参见ActionController 。

我还建议查看用于洞察的before_filter方法的实现。