繁体   English   中英

Rails控制器/模型方法

[英]Rails Controller/Model methods

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

def avatar_url
  ...
end

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

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

更新:

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

所以我可以说:

s = String.new
s.capitalize

如果此调用没有转到模型而不是控制器,那么它在哪里? 在Rails目录中定义类似String的类在哪里?

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

/things/super_action

应该在ThingsController调用def super_action ThingsController

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

Model.ultra_method

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

m = Model.new
m.instance_method

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

UPDATE

Stringruby语言的core类。 正如ArrayNumber等,在你的榜样,你正在创建一个instanceString并调用一个instance method中的String类。

看起来你是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。

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

z.avatar_url

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

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

希望我很清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM