2009-11-18 7 views
6

저는 레일을 처음 사용하기 때문에 여기에서 도움을 얻을 수 있습니다. 나는 몇몇 튜토리얼을 따라 코멘트와 심지어는 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 

게시물 컨트롤러는 find를 사용하여 주문을 취소 할 수 있습니다처럼 보이는

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 당신이 읽을 수 있도록 index 액션에 줄을 변경 것, 인덱스에 게시물을 반대로, 지적 두 가지 가능성이 있습니다.

옵션 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

이것은 정말 도움이되는 대답이었고 효과가있었습니다. 한 번 더 questin (미안). show.html.erb에서 작동하도록 AJAX 설정을했습니다. 하단에 대신 새로운 댓글을 추가 할 수는 없습니다. 나는 몇 가지를 시도했지만 빠른 단어는 여기에? – bgadoci

+0

AJAX를 어떻게 지내십니까? RJS 또는 ??? 블로그 자습서를 계속 따르는 경우 create.js.rjs의 첫 번째 줄 맨 아래 : 맨 위로 변경하고 싶습니다. JS를 다른 것으로 바꾸면 새로운 질문을 게시 할 가치가 있습니다. –

+0

이것들은'Comment' 모델 자체 내에서'default_scope' 메소드를 사용하는 세 번째 옵션입니다. 'default_scope : order => 'created_at desc'' –

0

: Post.find(:all, :order => "created_at DESC") 같은. 의견도 동일해야합니다. ,

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

의견 목록을 반대하기 위하여 :

+0

나는 위의 코멘트 컨트롤러에서 잘못된 코드를 넣어 것을 깨달았다. 위 주석 제어기 행에 명령 함수를 어디에 배치합니까? – bgadoci

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

위의 COMMENTS CONTROLLER에 잘못된 코드를 넣었습니다. 위 주석 제어기 행에 명령 함수를 어디에 배치합니까? – bgadoci

6

.each 메서드의 순서를 바꾸기위한보다 일반적인 방법을 찾고있는 경우 레일스는 .reverse_each 메서드를 사용합니다.그래서 같이 :

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

.reverse_each 방법은 will_paginate

에 부딪 여기에 솔루션을 것입니다

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

시도 사용 :이 SQL을 실행합니다

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

REVERSE_ORDER :

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