2012-04-11 21 views
1

我明白,这是重构尽可能多的我的代码尽可能到模型的最佳实践,但是我是比较新的轨道,和编程为一体。似乎导致我有点麻烦的一个概念是模型的本质,以及理解方法和变量的范围或可用性。基本款,理解类的基本面(Ruby on Rails的)

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

我明白,这些都是相当基本的原则,但我相信我的“想当然”关于这是造成我的问题,所有的方式。

+0

“的问题,所有的方式” - 列举其中的一些,也许我们可以解决这些问题。您发布的主要内容非常宽泛,无法回答,但最广泛的说法是:没有任何限制;-) – Pavling 2012-04-11 15:25:09

回答

1

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

  • 一个模式握着你的数据,并密切与您的数据的任何功能(逻辑低电平)
  • 一个控制器拥有您的业务逻辑(高级应用程序逻辑)
  • A 查看拥有您的表示层(用户界面)

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

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

受保护的方法限制对班内或班内任何孩子的访问。私人方法只限于在课堂内进行访问。

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


关于你对自己的问题...你可以使用自我来模拟自己的方法的所有调用,并且你不会出错。

例如对于具有姓氏和姓氏列的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 

但是,这太过分了。你其实并不需要使用自己在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 
+0

谢谢你,那太棒了,太自我了。只有当我想更改数据库中的属性时才需要,而不是如果我只是想读取它。 – RMcNairn 2012-04-11 17:07:50

+0

没错。别客气! – 2012-04-11 17:18:05

1

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

以下是我看待它:

模型=您的应用程序的逻辑
查看=前端为你的模型,在您需要的用户(或服务)看到
控制器的片搭售=视图和模型胶,调用模型数据并将其传递到视图

您应该避免直接从视图调用模型。 如果您要对控制器中的对象执行多于1次或2次的操作,则应该将其移至模型方法中。

从这里,我建议你拿起一本书来了解什么是类,实例方法,类方法等。 我推荐使用Pragma程序员的“Learn to Program”。 http://pragprog.com/book/ltp2/learn-to-program

从那里了解MVC是什么(大量的信息在那里),这将有助于您如何理解模型,视图,控制器以及它们如何关联。

+0

非常感谢,谢谢,我肯定会看看! – RMcNairn 2012-04-11 15:47:17

1

根据您的问题,看起来您需要阅读面向对象编程和MVC模式。当然,这些不是Rails专有的。