2010-09-26 73 views
0

我想围绕这个问题来解决我的问题。我知道意见不应该有那么多的逻辑。我有一个与用户,帖子和评论的应用程序。用户有很多帖子和评论。如何从我的视图中删除此逻辑?

class User < ActiveRecord::Base 
has_many :posts 
has_many :comments 

帖子属于用户,并有很多评论。

class Post < ActiveRecord::Base 
has_many :comments 
belongs_to :user 

评述属于用户和帖子

class Comment < ActiveRecord::Base 
belongs_to :post 
belongs_to :user 

在我的岗位#放映视图中显示我的下发表评论。我想显示发表评论的用户的姓名。目前我有这个在我看来:

<% @post.comments.each do |comment| %> 
    <p> 
    <b>Commenter:</b> 
    <%= link_to User.find(comment.userid).login, User.find(comment.userid) %> 
    </p> 

    <p> 
    <b>Comment:</b> 
    <%= comment.body %> 
    </p> 
<% end %> 

我应该有我的帖子控制器中的逻辑。但我很困惑。 @ post.comments返回属于帖子的评论数组(?)。这意味着我不能拥有@commenter = @ post.comments.userid。我对这个问题感到困惑,所以我可能没有解释清楚。

回答

3

事实上,在评论循环中,您可以使用comment.user来获取用户的数据,因为您已声明Userhas_manyComments关系。

+2

一个建议,你可以使用'<%=渲染:部分=> @ post.comments%>'来遍历那些评论一个接一个。在这种情况下,您必须将循环提取到另一个视图文件'_comment.html.erb'中。 – PeterWong 2010-09-26 15:39:12

+0

谢谢。这只是为了清理代码吗? – 2010-09-26 15:47:53

+1

是的,用于清理。我的回答会在视图文件中清除你的'User.find ...',我的注释会清理你的'@ post.comments.each'循环。 – PeterWong 2010-09-26 15:52:54

4

要在第一个答案更加明确,你只需做到这一点:

<%= link_to comment.user, comment.user %> 

在用户模式,覆盖这样使comment.user的to_s方法返回你想要的字符串:

def to_s 
    self.login 
end 

最后,使用预先加载在一次SQL调用中获取所有数据,而不是分别为每个comment.user查询DB。在发表你的模型:

class Post < ActiveRecord::Base 
    has_many :comments, :include => :user 

与后控制器:

def show 
    @post = Post.find(params[:id], :include => :comments) 
+0

+1表示更清晰。 – PeterWong 2010-09-27 02:26:58