1

我知道将尽可能多的代码重构到模型中是最佳实践,但是我对 Rails 和整个编程都比较陌生。似乎给我带来一点麻烦的概念之一是模型的性质,以及对方法和变量的范围或可用性的理解。

首先,使用模型中编写的典型方法,可以调用您的方法的限制(范围)是什么?.self 方面如何工作?哪些控制器/视图可以访问模型中定义的方法?

我知道这些是相当基本的原则,但我相信我对此的“假设”给我带来了各种各样的问题。

4

3 回答 3

1

在模型-视图-控制器 ( MVC ) 中:

  • 模型保存您的数据以及您的数据密切相关的任何功能(低级逻辑)
  • 控制器保存您的业务逻辑(高级应用程序逻辑)
  • 视图包含您的表示层(用户界面)

视图可以访问任何公共模型方法。(注意:所有 ruby​​ 方法默认都是公共的。)当然,模型对象必须首先在适当的控制器方法中实例化,并且必须是实例变量(ie @person)而不是控制器中的局部变量(ie person)。

控制器还可以访问任何公共模型方法。

受保护的方法限制对类内部或其任何子级的访问。私有方法仅限制对类内的访问。

在我看来,类方法,即def Person.some_method ...,在任何地方都是可见的,无论它们是否定义为公共、受保护或私有,尽管这是违反直觉的。


关于你关于 self 的问题......你可以使用 self 从该模型内部对模型自己的方法的所有调用,你不会出错。

例如对于具有 first_name 和 last_name 列的 Person 模型:

class Person < ActiveRecord::Base
  def full_name
    "#{self.first_name} #{self.last_name}"
  end

  def parse_name full
    self.first_name, self.last_name = full.split
  end
end

然而,这太过分了。您实际上不需要使用 self 来检索 ActiveRecord 中的属性,仅用于设置属性,因此以下是可以的:

class Person < ActiveRecord::Base
  def full_name
    "#{first_name} #{last_name}"
  end

  def parse_name full
    self.first_name, self.last_name = full.split
  end
end
于 2012-04-11T16:50:51.303 回答
1

简而言之,您可以使用什么来访问模型并没有真正的限制。从技术上讲,您可以从视图和控制器中的模型或其他模型中调用方法。

这是我的看法:

模型 = 您的应用程序的逻辑
视图 = 模型的前端,绑定您希望用户(或服务)看到的部分
控制器 = 视图和模型的胶水,调用模型数据并将其传递给视图

你应该避免直接从你的视图中调用你的模型。如果您在控制器中对一个对象执行超过 1 或 2 个操作,您可能应该将其移动到模型方法中。

从这里开始,我建议你拿起一本书来了解类的作用、实例方法、类方法等。我推荐 Pragmatic Programmers 的“Learn to Program”。 http://pragprog.com/book/ltp2/learn-to-program

从那里了解 MVC 是什么(那里有很多信息),这将有助于您理解模型、视图、控制器以及它们之间的关系。

于 2012-04-11T14:22:04.410 回答
1

根据您的问题,您似乎需要阅读面向对象编程和 MVC 模式。当然,这些并不是 Rails 独有的。

于 2012-04-11T14:22:49.883 回答