2009-11-18 18 views
6

Raylar konusunda yeniyim, bu yüzden yardıma ihtiyacım var. Yorumlar ve hatta bazı AJAX zilleri ve ıslıklarıyla bir blog oluşturmak için birkaç dersi takip ettim ve umarım kolay olan bir şeye takılıyorum. Hem bloglar hem de yorumlar için varsayılan ekran, en eski olanı listelemektir. En son girişleri ve en yeni yorumları en üstte göstermek için bunu nasıl tersine çeviririm? Bunun denetleyici veya modelin bir işlevi olup olmadığını bilme. Bazı özelleştirme yaptım, işte burada yardımcı olan denetleyici .rb dosyaları için kod.Blog girişleri ve yorumları ekran görünümü tersine çevrilir, Ruby on Rails

YORUMLAR KONTROL

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 

mesajlar KUMANDA Eğer find kullanarak sırasını tersine çevirebilir gibi görünüyor

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 

cevap

19

jtbandes okumak için endeks eylem çizgisini değiştirmek istiyorum, endekste mesajları tersine çevirmek için, belirttiği gibi iki olasılık var.

1. Seçenek: şöyle ilişkinizi ilan edebilir yayınınız modelinde:

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

Seçenek 2: indeks görünümünde, sadece onları görüntülemeden önce her yayının yorumların dizi ters:

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

Seçeneklerin farklı kullanım durumları vardır. Seçenek 1'de, tüm uygulamanız boyunca, bir gönderi hakkındaki yorumlara başvurduğunuz her zaman, söz konusu yorumların belirtilen sırayla veritabanından alınacağını söylüyorsunuz. Bunun, uygulamanızın yorumlarının özgün bir özelliği olduğunu söylüyorsunuz. Yayınlar, varsayılan olarak en yenisi ilk sırada olan çok sayıda yoruma sahip.

Seçenek 2'de, dizin sayfasındaki yorumları işlenmeden önce basitçe tersine çeviriyorsunuz. Veritabanından hala orijinal sırayla (en eski olanı) alındılar ve uygulamanızda bir gönderinin yorumlarına eriştiğiniz başka bir yerde bu sırayla görünmeye devam edecekler.

+0

Bu gerçekten yararlı bir cevaptı ve işe yaradı. Bir sorum daha var (üzgünüm). Show.html.erb üzerinde çalışmak için AJAX kurulumum var. Alttaki yerine yeni yorumu eklemek için bunu alamıyorum. Birkaç şey denedim ama burada hızlı bir kelime var mı? – bgadoci

+0

AJAX'i nasıl yapıyorsunuz? RJS veya ??? Hala blog eğiticisini takip ediyorsanız, sadece şunu değiştirmek istersiniz: aşağıdan yukarıya: create.js.rjs'deki ilk satırın üstüne ... JS'nizi başka bir şeye çevirmişseniz, yeni bir soru göndermeye değer olabilir. –

+0

Bunlar, 'Comment' modelinin kendi içinde' default_scope 'yöntemini kullanmak olan üçüncü bir seçenektir. default_scope: order => 'created_at' –

0

: Post.find(:all, :order => "created_at DESC") gibi bir şey. Aynı yorumlar için geçerli olmalıdır. ,

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

Yorumlarınızın listesini tersine çevirmek amacıyla:

+0

ben yukarıdaki YORUMLAR CONTROLLER yanlış kod koymak olduğunu fark etti. Yukarıdaki yorum denetleyici satırında sipariş işlevini nereye yerleştiririm? – bgadoci

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

Yanlış kodları yukarıdaki COMMENTS CONTROLLER'a koyduğumu fark ettim. Yukarıdaki yorum denetleyici satırında sipariş işlevini nereye yerleştiririm? – bgadoci

6

.each yönteminin sırasını tersine çevirmek için daha genel bir yöntem arıyorsanız, Rails .reverse_each yöntemine sahiptir.böylece gibi:

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

.reverse_each yöntem will_paginate

ile çarpma burada çözümdür

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

deneyin kullanım: Bu SQL çalıştırır

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

reverse_order :

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

hiçbir sipariş fıkra sorguda belirtilirse, ters sırada birincil anahtar ile reverse_order emirleri. çalıştırır

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