2010-08-09 99 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