我正在观看Code School Rails测试课程。有一个类zombie
的实例。 zombie
模型有一个方法:
def avatar_url
...
end
在测试中,.rb
文件具有以下内容:
z.avatar_url
Model.method
而不是object.method
。更新
让我们以类String为例,它不是模型,对吗?
所以我可以说:
s = String.new
s.capitalize
如果此呼叫没有转到模型而不转到控制器,那么它在哪里?像Rails这样的类在Rails目录中定义在哪里?
答案 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
。
<强>更新强>
String
是core
类ruby
语言。与Array
,Number
等一样。在您的示例中,您创建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路由。
希望我很清楚。