2012-04-11 22 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專有的。