2010-08-09 103 views
3

我有一個佈局下面的代碼:Rails的最佳實踐

Posted <%=time_ago_in_words post.created_at %> ago 
<% if post.has_tag != nil %> 
    in the <%= post.get_first_tag.name %> category 
<% end %> 

與後模型,在繼承形式的ActiveRecord下面的代碼::基地

def has_tag 
!self.tags.empty? 
end 

def get_first_tag 
self.tags[0] 
end 

標籤也從ActiveRecord的::基地和郵報「的has_many」標籤

首先繼承:這是檢查是否帖子對象至少1 associ的最佳途徑吃了標籤屬性。

其次:我應該把這個邏輯放到一個輔助方法?

三:爲什麼下面的工作(它返回一個#,其中標籤應該是):

in the <%= post.tags.to_sentence %> category, 

我猜它是因爲標籤不實際存儲爲一個數組屬性,但我不真的不知道。


回答

4

這是否有標籤或沒有檢查的一個非常好的途徑。但是,self.tags.empty?將返回true或false,因此post.has_tag永遠不會爲零。

值得一提的是,在Ruby中,是很常見的名字方法,返回true或false一個問號。所以post.has_tag?將是您的方法更好的名稱(如標籤的empty?方法)。

這類方法的所屬的模型類,而不是因爲它是不特定的視圖層的輔助;例如,您可能想從其他模型類中調用此方法。

你得到#,而不是你的標籤名稱的原因是,您要的標籤集合轉換成句子,你需要,而不是爲標籤的名稱轉換爲一個句子。你應該可以做

post.tags.map(&:name).to_sentence 

這將採取標籤的名稱並把它們變成一個句子。

+0

感謝您的回覆,這裏有3個真正有用的指針 – zode64 2010-08-10 13:46:35

+0

是的,絕對讓函數名稱結束?用於返回布爾值的任何函數。 – 2010-08-10 15:16:38

1

一件事,你可能需要

<% if post.has_tag %> 

,而不是

<% if post.has_tag != nil %> 

在你的定義,has_tag應該不會再回來nil,因而 '在......' 部分將始終顯示。

一般來說,你的想法似乎沒什麼問題:我經常喜歡添加這些傭工模式。

+0

Ahh,我的拼寫錯誤我在修改代碼的同時編寫問題並忘記了更新,感謝回覆 – zode64 2010-08-10 13:44:19