Rails 控制器/模型方法

4

我正在观看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

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

记住你可以调用obj.class,例如String.class来查看它继承自哪个类。你可以不断添加.class以返回到基本的Class类。 - New Alexandria
好的,谢谢你的提示。在Rails文件夹中,我应该在哪里定义自定义类? - Linus
1
自定义类应放在/lib中,除非它们依赖于/app中的模型或其他内容。 - New Alexandria
啊,我明白了,这非常有启发性!非常感谢你们所有人! - Linus
3个回答

9

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

/things/super_action

应该在ThingsController内部调用def super_action

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

Model.ultra_method

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

m = Model.new
m.instance_method

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

更新

StringRuby语言的核心类之一,就像ArrayNumber等一样。在你的示例中,你正在创建String类的一个实例并调用其实例方法


谢谢您的回答,请看一下我更新后的问题。 - Linus
回答已经更新。我建议你阅读一下 Ruby 方法类型的相关内容。 =] - MurifoX

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。

1
非常感谢您的解释,现在似乎更清晰了。您说得对,我也是Ruby的新手,所以有一些地方令人困惑。 - Linus
1
鼓励您不要写“长篇大论”的文字。段落是每个人的朋友。 - New Alexandria
抱歉,我在手机上打字。有点挤。现在应该好了 :) - grandinero

2
您可以在Rails中的任何地方调用Model类/实例方法。Model只是对数据库的映射,充当数据库的代理。当您调用时,
z.avatar_url

您正在调用“z”模型实例上的方法。因此,无论从哪里调用它,都将始终调用模型的方法。
如果您在控制器和模型中都定义了同名方法,则始终会使用模型实例或模型类调用模型的方法。控制器方法只是Rails中的操作,它们永远不会直接从任何地方引用。它们用于Rails路由。
希望我表达清楚了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接