Rails控制器/模型方法

时间:2013-09-05 12:17:51

标签: ruby-on-rails ruby

我正在观看Code School Rails测试课程。有一个类zombie的实例。 zombie模型有一个方法:

def avatar_url
  ...
end

在测试中,.rb文件具有以下内容:

z.avatar_url
  1. 当我调用这样的方法时,如果我调用控制器或模型方法,Rails如何区分?我没有想过从控制器以外调用模型方法,而只是像Model.method而不是object.method
  2. 如果我的控制器和我的模型都有一个同名的方法,那么Rails如何知道要调用哪一个?
  3. 更新

    让我们以类String为例,它不是模型,对吗?

    所以我可以说:

    s = String.new
    s.capitalize
    

    如果此呼叫没有转到模型而不转到控制器,那么它在哪里?像Rails这样的类在Rails目录中定义在哪里?

3 个答案:

答案 0 :(得分:9)

控制器内部的方法只能通过URL调用 示例:

/things/super_action

应拨打def super_action内的ThingsController

对于模型方法,可以在任何地方访问它们。请注意它们是实例还是类方法:

Model.ultra_method

这是一个类方法调用,它可能定义为def self.ultra_method

m = Model.new
m.instance_method

这是一个实例方法调用,它可能定义为def ultra_method

<强>更新

Stringcoreruby语言。与ArrayNumber等一样。在您的示例中,您创建instance String并调用instance method类的String

答案 1 :(得分:4)

看起来你是Ruby以及Rails的新手。在Ruby中,类有点像对象类型的描述(尽管类本身也是一个对象)。只要定义了类,就可以像String.new一样创建它的新实例。请注意,类始终具有大写名称。

类方法是对类本身起作用的方法。您可以判断方法何时是类方法,因为它将附加到类的大写名称(就像String.new)。另一方面,实例方法仅适用于类的实例,而不适用于类本身(例如str = String.new; str.capitalize!)。通常有更多的实例方法而不是类方法,因为实例是您实际使用的东西(new是您将看到的最常见的类方法。)

正如其他人在这里提到的,String不是Rails模型;这是一个基本的Ruby类。当您在Rails中工作时,您可以访问所有常规Ruby类以及Rails源代码中定义的其他类和方法。所以String没有在Rails本身中定义,但是Rails确实为字符串提供了一些有用的实例方法(例如str.to_date)。

Rails中的模型实际上只是一个Ruby类。要了解模型的工作原理,您应该确保了解Ruby类的工作原理。 Rails模型的特殊之处在于它们继承自Rails的源代码中定义的类,称为ActiveRecord(Ruby中的任何类都可以从另一个类继承,这只是其中的一个例子)。 ActiveRecord有许多类和实例方法,它们也可用于模型,因为它们继承自ActiveRecord。例如,如果您有一个名为Person的类(模型),则可以自动使用Person.find(id)类方法在数据库中查找Person类的特定实例。您还可以使用person.save实例方法将实例保存到数据库中。

当我刚开始学习时,所有这一切都让我感到困惑,所以我最好的建议是在学习Rails时熟悉Ruby。

答案 2 :(得分:2)

您可以在Rails中的任何位置调用Model类/实例方法。模型只是数据库的映射,并充当数据库的代理。当你打电话时

z.avatar_url

您正在调用“z”模型实例上的方法。所以无论你在哪里调用它都会调用模型的方法。

如果在控制器和模型中定义一个具有相同名称的方法,则始终使用模型实例或模型类调用模型的方法。控制器方法只是Rails中的操作,它们永远不会从任何地方直接引用。它们用于Rails路由。

希望我很清楚。