【问题标题】:Rails Controller/Model methodsRails 控制器/模型方法
【发布时间】:2013-09-06 01:53:48
【问题描述】:

我正在观看 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 这样的类?

【问题讨论】:

  • 记住你可以调用 obj.class,例如String.class 看看它继承自什么。您可以继续附加 .class 以返回基本 Class 类
  • 好的,谢谢你的提示。我将在 rails 文件夹中的哪个位置定义自定义类?
  • 自定义类进入/lib,除非它们依赖于模型或/app中的其他东西
  • 啊,我明白了,这很有启发性!非常感谢大家!

标签: ruby-on-rails ruby


【解决方案1】:

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

/things/super_action

应该在ThingsController 中调用def super_action。

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

Model.ultra_method

这是一个类方法调用,大概定义为def self.ultra_method。

m = Model.new
m.instance_method

这是一个实例方法调用,大概定义为def ultra_method。

更新

String 是 core 类的 ruby 语言。与Array、Number 等一样。在您的示例中,您正在创建String 的instance 并调用String 类的instance method。

【讨论】:

  • 感谢您的回答,请查看我更新的问题。
  • 更新了答案。我建议你阅读 ruby​​ 中的方法类型。 =]
【解决方案2】:

您似乎是 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。

【讨论】:

  • 非常感谢您的解释,现在似乎更清楚了。你说得对,我也是 Ruby 新手,所以有一些令人困惑的部分。
  • 鼓励你不要写“文字墙”。段落是每个人的朋友
  • 抱歉,在我的手机上打字。它有点狭窄。现在应该更好了:)
【解决方案3】:

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

z.avatar_url

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

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

希望我清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多