2009-11-23 101 views
2

我是新來的鐵路,所以去輕鬆。我創建了一個博客。我已成功實施評論並將其附加到每個帖子。現在...我想在側邊欄中顯示所有帖子中最新評論的列表。我認爲這裏涉及到兩件事,一個是對comment_controller.rb的更新,然後是來自實際頁面的調用。這是註釋控制器代碼。如何渲染Rails視圖中的所有註釋?

class CommentsController < ApplicationController 

    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.create!(params[:comment]) 

    respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 
end 

回答

5

如果你想顯示的任何職位的所有意見,在最近的訂單,你可以這樣做:

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 10) 

並在視圖,你可以這樣做:

<% @comments.each do |comment| -%> 
    <p> 
     <%= comment.text %> on the post <%= comment.post.title %> 
    </p> 
<% end -%> 
+0

這看起來像什麼,我期待的。剛試過它沒有用。我懷疑這是因爲我錯誤地引用了它。第二部分(視圖)正在放入帖子的佈局文件夾中......是否將@comments更改爲評論,反之亦然? – bgadoci 2009-11-23 06:07:45

+0

如果你把它放在佈局中,那麼你可能只想將查找語句內聯到佈局中,如下所示: <%Comment.find(:all,:order =>'created_at DESC',:limit => 10).each do | comment | - %> 我不確定這將如何格式化評論,但希望這是有道理的。 一般來說,在視圖中放置邏輯是令人不悅的,但唯一的另一種方式是我可以認爲你可以訪問每個頁面上的@comments變量,如果你在ApplicationController中的每個方法之前運行一個鉤子。 – mmrobins 2009-11-23 06:45:40

+0

這工作的人。謝謝。 – bgadoci 2009-11-23 07:04:48

4

我發佈了一個單獨的答案,因爲代碼在評論中顯然沒有很好地格式化。

我猜你與以前的答案具有的問題是,你把

@comments = Comment.find(:all, :order => 'created_at DESC', :limit => 10) 

在你的控制方法之一。但是,您希望@comments可用於佈局文件,因此您必須將每個控制器的每個控制器方法都放在該控制器方法中才能使用該方法。雖然把邏輯的觀點是令人難以接受的,我認爲這是可以接受做到以下幾點在你的佈局文件:

<% Comment.find(:all, :order => 'created_at DESC', :limit => 10).each do |comment| -%> 
    <p> 
     <%= comment.text %> on the post <%= comment.post.title %> 
    </p> 
<% end -%> 

爲了得到一些邏輯出來的觀點,雖然我們可以把它移動到評價模型

class Comment < ActiveRecord::Base 
    named_scope :recent, :order => ["created_at DESC"], :limit => 10 

現在,您可以在您的視圖做到這一點:

<% Comment.recent.each do |comment| -%> 
    <p> 
     <%= comment.text %> on the post <%= comment.post.title %> 
    </p> 
<% end -%> 

這使得一個不錯的fat model and skinny controller

+1

我喜歡命名範圍,儘管視圖代碼非常乾淨,但完全繞過了控制器。我猜我的第一槍會在App Controller的before_filter中調用Comment.recent,但我可能會錯。 – 2009-11-23 07:09:46

+0

+1爲命名範圍,但安迪的權利。這屬於應用程序控制器中的過濾器。它仍然有效,但視圖不應直接處理模型。 – EmFi 2009-11-23 07:43:38

+0

我看到之前過濾器的觀點,但我認爲我實際上更喜歡這次在視圖中的邏輯。在我看來,它比應用程序控制器中的過濾器更清晰,更有意義,它可能會在您稍後閱讀代碼,想知道@comments變量來自何處時,最終會撓頭。至少如果你打算把過濾器放在應用程序控制器中,你應該選擇一個非常獨特的變量名,以免污染命名空間。所以@recent_comments_for_layout而不是@comments。 – mmrobins 2009-11-23 16:14:59

0

我傾向於使用一個幫手是:

# in app/helpers/application_helper.rb: 
def sidebar_comments(force_refresh = false) 
    @sidebar_comments = nil if force_refresh 
    @sidebar_comments ||= Comment.find(:all, :order => 'created_at DESC', :limit => 10) 
    # or ||= Comment.recent.limited(10) if you are using nifty named scopes 
end 

# in app/views/layouts/application.html.erb: 
<div id='sidebar'> 
    <ul id='recent_comments'> 
    <% sidebar_comments.each do |c| %> 
     <li class='comment'> 
     <blockquote cite="<%= comment_path(c) -%>"><%= c.text -%></blockquote> 
     </li> 
    <% end %> 
    </ul> 
</div>