簡體   English   中英

Rails控制器/模型方法

[英]Rails Controller/Model methods

我正在觀看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的類在哪里?

控制器內部的方法只能通過URL調用。
例:

/things/super_action

應該在ThingsController調用def super_action ThingsController

至於模型方法,它們可以在任何地方訪問。 請注意它們是實例還是類方法:

Model.ultra_method

這是一個類方法調用,它可能被定義為def self.ultra_method

m = Model.new
m.instance_method

這是一個實例方法調用,它可能定義為def ultra_method

UPDATE

Stringruby語言的core類。 正如ArrayNumber等,在你的榜樣,你正在創建一個instanceString並調用一個instance method中的String類。

看起來你是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。

您可以在Rails中的任何位置調用Model類/實例方法。 模型只是數據庫的映射,並充當數據庫的代理。 當你打電話的時候

z.avatar_url

你正在調用“z”模型實例上的方法。 所以無論你在哪里調用它總是會調用模型的方法。

如果在控制器和模型中定義具有相同名稱的方法,則始終使用模型實例或模型類調用模型的方法。 控制器方法只是Rails中的操作,它們永遠不會從任何地方直接引用。 它們用於Rails路由。

希望我很清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM