2009-11-18 38 views
6

我是新來的rails,所以可以在這裏使用一些幫助。我遵循了幾個教程來創建一個帶有評論的博客,甚至還有一些AJAX的花裏胡哨的東西,我被困在一些我希望很容易的東西上。博客和評論的默認顯示是列出最早的第一個。如何反向顯示最新的條目和最新的評論。真的不知道這是否是控制器或模型的功能。我已經做了一些定製,所以這裏是控制器.rb文件的代碼,如果它有幫助。顯示博客條目和評論的反向順序,Ruby on Rails

評論CONTROLLER

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 

Posts控制器

class PostsController < ApplicationController 
    before_filter :authenticate, :except => [:index, :show] 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.all(:include => :comments) 


    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/new 
    # GET /posts/new.xml 
    def new 
    @post = Post.new 

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

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    end 

    # POST /posts 
    # POST /posts.xml 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     flash[:notice] = 'Post was successfully created.' 
     format.html { redirect_to(@post) } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /posts/1 
    # PUT /posts/1.xml 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     flash[:notice] = 'Post was successfully updated.' 
     format.html { redirect_to(@post) } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.xml 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
    end 
    end 

    private 

    def authenticate 
    authenticate_or_request_with_http_basic do |name, password| 
     name == "admin" && password == "secret" 
    end 
    end 
end 

回答

19

由於jtbandes指出,要扭轉帖子在索引中,你會改變線路索引中的作用如下:

@posts = Post.all(:include => :comments, :order => "created_at DESC") 

爲了扭轉您的意見的上市,有兩種可能性。

選項1:在您的文章模型,你可以聲明像這樣的關係:

class Post < ActiveRecord::Base 
    has_many :comments, :order => "created_at DESC" 
end 

選項2:在你的索引視圖,簡單地顯示在他們面前扭轉各崗位的評論數組:

<% @posts.each do |post| %> 
    <%= render :partial => post %> 
    <%= render :partial => post.comments.reverse %> 
<% end %> 

這些選項有不同的用例。在選項1中,你說的是在整個應用程序中,每當你引用一篇文章的評論時,都應該按照指定的順序從數據庫中檢索這些評論。你有點說這是你應用程序中評論的內在屬性 - 帖子有很多評論,默認情況下默認排在最前。

在選項2中,您只是在索引頁面呈現之前顛倒了索引頁面中的評論。它們仍然以數據庫中的原始順序(最早的第一個)進行檢索,並且它們仍然會以您訪問應用程序中某篇文章的評論的其他任何位置的順序顯示。

+0

這是一個非常有用的答案,它的工作。還有一個問題(對不起)。我有AJAX設置工作在show.html.erb。我無法讓它在頂部而不是底部添加新評論。我已經嘗試了幾件事情,但在這裏有任何快速的話? – bgadoci 2009-11-18 04:08:36

+0

你是如何做AJAX的? RJS或???如果你仍然關注博客教程,你只是想在create.js.rjs的第一行上將底部改爲:頂部......如果你將JS切換到其他的東西,可能值得發佈一個新問題。 – 2009-11-18 04:54:05

+0

這是第三個選項,它使用'Comment'模型本身內的'default_scope'方法。 'default_scope:order =>'created_at desc'' – 2009-11-18 09:46:01

0

看起來你可以使用反向的find順序:像Post.find(:all, :order => "created_at DESC")。這同樣適用於評論。

+0

我意識到,我把錯誤的代碼中的註釋CONTROLLER以上。我在哪裏可以將訂單功能放在上面的評論控制器中? – bgadoci 2009-11-18 03:05:46

3
@posts = Post.find(:all, :include => :comments, :order => "published_at DESC") 
+0

我意識到我在上面的COMMENTS CONTROLLER中輸入了錯誤的代碼。我在哪裏可以將訂單功能放在上面的評論控制器中? – bgadoci 2009-11-18 03:02:38

6

如果您正在尋找更爲普通的方法來顛倒.each方法的順序,Rails的方法是.reverse_each。像這樣:

<% @posts.reverse_each do |post| %> 
    <%= render :partial => post %> 
    <%= render :partial => post.comments.reverse %> 
<% end %> 
0

.reverse_eachwill_paginate

碰撞這裏是解決

@posts = Post.all.paginate(:order => "created_at DESC",:page => params[:page],:per_page => 5) 
0

嘗試使用:reverse_order

Client.where("orders_count > 10").order(:name).reverse_order 

這將執行SQL:

SELECT * FROM clients WHERE orders_count > 10 ORDER BY name DESC 

如果在查詢中未指定任何排序子句,則reverse_order將按相反順序由主鍵排序。

Client.where("orders_count > 10").reverse_order 

將執行:

SELECT * FROM clients WHERE orders_count > 10 ORDER BY clients.id DESC 

http://edgeguides.rubyonrails.org/active_record_querying.html#reorder