[英]Rails Controller/Model methods
我正在觀看Code School Rails測試課程。 有一個zombie
類的實例。 zombie
模型有一個方法:
def avatar_url
...
end
在測試中, .rb
文件具有以下內容:
z.avatar_url
Model.method
而不是object.method
。 更新:
讓我們以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
String
是ruby
語言的core
類。 正如Array
, Number
等,在你的榜樣,你正在創建一個instance
的String
並調用一個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.