先來說說Rails 2.3中即將問世的Object#try吧
有時候我們不知道某個物件是否能夠回應某個呼叫,我們可以用object.respond_to?(method)來判斷傳回的是true還是false,因此我們可以藉由這個特性來達到我們要的目的:
f = Factory.first
puts f.category.try(:name)
只要有辦法回應就會直接呼叫name這個member function;但是別忘記了,現在還是Rails 2.2 ...
所以,我們可以自己寫一個try來用,先在Rails Project Root底下的lib新增一個try.rb,然後再config/environment.rb中新增一行:
require 'try' if Rails.version =~ /^2\.2/
這代表著如果不是2.2的版本就不要引入,當然如果你是其他版本的可以自己弄一下
然後,try.rb內寫:
class Object
def try(method)
return send(method) if respond_to?(method)
end
end
存檔後重新啟動你的Rails Server即可
使用方式可參考:http://www.javaeye.com/topic/169001
這種方法有一些缺陷,所以你可以去看看要怎樣處理
再來說說Model.to_json吧
Rails可以用.to_json將你的資料轉成JSON輸出,不過你會發現為什麼產生的格式會有點不一樣:
Factory.all.to_json #=> [{"factory": {:.....}]
到底要怎樣才能把Model Name給隱藏呢?其實只要在你的Model內加上一段程式碼就好:
class Factory < ActiveRecord::Base
self.include_root_in_json = false
end
這樣就能關閉了~
而且,.to_json不只可以回傳attributes,也能回傳自己寫的methods哦:
Factory.all.to_json(:methods => [:href, :src]) #=> 這樣回傳的JSON就會有{"href": '...', "src": '...'}了
如果說,不想要回傳任何一個attributes只想回傳methods該怎樣做呢?
Factory.all.to_json(:only => [], :methods => :href) #=> 傳空的陣列給:only就OK啦!
Person.new("CFC").say("Happy Valentines Day").to("You")
#=> CFC said Happy Valentines Day to You
Rails Fun~
下次再見啦XD