2010-09-26 60 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