2010-01-18 61 views
2

我是Ruby的新手,并通过一些教程/屏幕录像工作。我已经到了他们正在讨论before_filter回调的部分,它使用了一些对我来说有点奇怪的语法。我不知道这是否是红宝石的一个特征,是否有一些轨道魔法,并且希望有人能够让我直接或者指向正确的方向w/r/t手册从Ruby类中调用方法? (或者这是轨道魔术)

这是一个代码从截屏视频片段我看

class MachinesController < ApplicationController 
    #... 
    before_filter :login_required, :only => [:report] 
    #...  
    def index 
     #etc... 
    end 

    def login_required 
     #etc... 
    end 
end 

在轨的情况下,我的理解是before_filter是一个回调,这将触发login_required方法时report动作被调用。然而,我不清楚它是在ruby的背景下。在其他语言中,类通常包含大括号内定义的方法,属性,类变量和常量。

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

+0

国际海事组织你应该选择莎拉梅的答案作为你选择的答案,它提供了最好的和最完整的解释。 – horseyguy 2010-01-23 00:38:39

+0

莎拉的回答非常好,但这是我没有问过的问题。我对类中的方法的调用感到困惑,这是你在PHP或Java中无法做到的。我想知道这是否是一些轨道魔法,或者如果Ruby支持这一点,并且如果Ruby支持这一点,那么在一个类中不同的w/r/t调用代码是什么。乔纳森回答说,解释了自我如何改变了身份。 – 2010-01-23 04:00:16

+0

也许这个问题应该编辑一下,我想的是这样的:“Ruby:从类定义中调用函数” – 2012-05-23 22:23:45

回答

5

before_filter实际上不是回调。这是一个class method of ActiveRecord::Base,当您调用它时会设置回调。因此,在这个例子中:

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

当把类装载,所述方法被调用,并把它添加到:login_required过滤器链的report方法。

这些类型的呼叫约定是下降的括号,但如果你这样做它会工作得很好(并会更容易被识别为一个方法调用):

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

+1迄今为止的最佳答案 – horseyguy 2010-01-18 10:34:36

0

Ruby很酷。您绝对可以从一个课程块中发送消息。据我了解,class除了显而易见的外,还有其他的东西是控制self的身份。因此,你应该能够从那里调用该类的任何方法或包含的模块。

+0

啊,我还没有遇到过self关键字,或者学习了如何定义静态/类方法。这使得现在更有意义(但仍然非常奇怪) – 2010-01-18 08:01:59

+1

您不能从类定义中调用在“包含的模块”上定义的方法。为了在类定义中调用模块提供的方法,模块必须在类中“扩展”而不是“包含”。 – horseyguy 2010-01-23 00:36:07

0

我不知道你的问题是什么,但这里是我的解释:

before_filter 

这是一个类的方法调用看ActionController

:login_required 

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

:only => [:report] 

Th是before_filter的另一个Hash参数,请参阅ActionController

我也建议看看before_filter方法的实现以获得洞察。

+0

我的问题/困惑主要集中在以下事实上:您在类块内运行代码或方法定义以外的代码。你不能用像Java或PHP这样的语言来做这件事,我正在寻找一个解释/教程,讲解如何从一个类运行的代码(不是类方法)与运行在类定义之外的代码不同。 – 2010-01-18 05:37:59

+0

啊,我明白了。 :) – hobodave 2010-01-18 05:42:35

+0

嘿,我只是意识到这是我一直认为理所当然的事,从来没有质疑过。现在,我很好奇,试图自己找到解释。你应该更新你的问题,使它更清楚你需要什么,你的评论是清楚的 - 问题不是。 – hobodave 2010-01-18 05:45:17

1

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

这是一种机制,它允许您使用Rails获得惊人的美丽(至少我的眼睛,至少)语法,它几乎看起来像使用某种特定于域的语言来描述您的模型。类似于模型类上的validates,has_manybelongs_to函数调用。

我的理解是,这被称为宏,属于元编程的保护伞。您可以read more about this topic