代码之家  ›  专栏  ›  技术社区  ›  Alana Storm

从Ruby类中调用方法(或者这是rails的魔力)

  •  2
  • Alana Storm  · 技术社区  · 16 年前

    我是Ruby新手,正在学习一些教程/屏幕广播。我已经到了他们正在讨论的部分 before_filter 回调,它使用的语法对我来说有点奇怪。我不知道这是否是ruby的一个特性,也不知道这是否是rails的魔力,我希望这里的人能帮我纠正错误,或者给我指出正确的方向

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

    在rails的上下文中,我理解这一点 前过滤器 是一个将触发的回调 login_required report 我们需要行动。然而,我不清楚在ruby的上下文中它是什么。在其他语言中,类通常包含大括号中定义的方法、属性、类变量和常量。

    4 回复  |  直到 16 年前
        1
  •  5
  •   Sarah Mei    16 年前

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

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

    加载该类时,将调用该方法,并添加 :login_required 连接到过滤器的过滤器链 report 方法。

    before_filter(:login_required, :only => [:report])
    
        2
  •  1
  •   Richard Jones    13 年前

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

    这是一种机制,它允许您使用Rails获得惊人的漂亮(至少在我看来)语法,看起来您使用某种特定于领域的语言来描述您的模型。比如 validates , has_many belongs_to 函数调用模型类。

    read more about this topic .

        3
  •  0
  •   Jonathan Sterling    16 年前

    鲁比太酷了。您完全可以从类块内发送消息。据我所知,事情是什么样的 class 做,除了显而易见的,是控制身份的 self . 因此,您应该能够从那里调用类的任何方法或包含的模块。

        4
  •  0
  •   hobodave    16 年前

    我不确定你的问题到底是什么,但以下是我的解释:

    before_filter
    

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

    :login_required
    

    Object#send

    :only => [:report]
    

    这是一个附加的散列参数,请参阅 动作控制器

    推荐文章