4

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

def avatar_url
  ...
end

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

z.avatar_url
  1. 当我调用这样的方法时,Rails 如何区分我调用的是控制器方法还是模型方法?我没有想过从控制器以外的其他地方调用模型方法,只有 likeModel.method和 not object.method
  2. 如果我的控制器和模型都有同名的方法,Rails 怎么知道要调用哪一个呢?

更新:

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

所以我可以说:

s = String.new
s.capitalize

如果这个调用不去一个模型而不是一个控制器,那么它会去哪里呢?在 Rails 目录中哪里会定义像 String 这样的类?

4

3 回答 3

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.

更新

String是一coreruby语言。原样ArrayNumber等。在您的示例中,您正在创建一个instanceofString并调用instance method该类String

于 2013-09-05T12:31:07.880 回答
4

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

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

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

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

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

于 2013-09-05T16:42:59.873 回答
2

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

z.avatar_url

您正在“z”模型实例上调用方法。所以不管你从哪里调用它总是会调用模型的方法。

如果您在控制器和模型中定义同名的方法,您将始终使用模型实例或模型类调用模型的方法。控制器方法只是 Rails 中的操作,它们从不直接从任何地方引用。它们用于 Rails 路由。

希望我清楚。

于 2013-09-05T12:24:42.593 回答