2017-08-06 2 views
1

Ich erstelle eine Blog App mit Ruby on Rails. Ich konnte einem Benutzer das Hinzufügen von Posts erlauben, aber oben auf der Seite werden zuerst die Posts angezeigt, die zuerst erstellt wurden. Ich möchte, dass die neuesten Blogposts zuerst angezeigt werden. Wie mache ich das? Lassen Sie mich wissen, welche Code-Dateien ich hier hinzufügen muss.Rails: Wie man die letzten Blogposts erscheinen lässt

meine Artikel Controller

class ArticlesController < ApplicationController 
    def new 
     @article = Article.new 
    end 

    def index 
     @articles = Article.paginate(:page => params[:page], :per_page => 10) 
    end 

    def show 
     @article = Article.find(params[:id]) 
    end 

    def create 
     @article = Article.new(article_params) 

     @article.save 
     redirect_to @article 
    end 

    def edit 
     @article = Article.find(params[:id]) 
    end 

    def update 
     @article = Article.find(params[:id]) 
     if @article.update(article_params) 
      redirect_to @article 
     else 
      render 'edit' 
     end 

    end 

    def destroy 
     @article = Article.find(params[:id]) 
     @article.destroy 

     redirect_to articles_path 
    end 
end 

private 
def article_params 
    params.require(:article).permit(:title, :text, :datee) 
end 
+0

Do als @ Rockwell Rice vorgeschlagen. Standardmäßig werden sie in aufsteigender Reihenfolge aufgelistet, es sei denn, Sie geben etwas anderes vor, indem Sie den Bereich ändern. – Belder

Antwort

5

ich einen Standardbereich im Modell festgelegt würden, könnten Sie einfach order verwenden, aber das ist, wie ich es tun, weil ich in der Regel immer wollen, dass Reihenfolge angewendet und auf diese Weise I muss nicht weiter order verwenden. Setzen Sie dies in Ihr Modell und es sollte sie neu anordnen.

article.rb

# Scopes 
default_scope {order(created_at: :desc)} 

Mit einem Standardbereich festgelegt ist keine weiteren Maßnahmen Artikel benötigt werden, um diese Reihenfolge nicht erfüllt.

Wenn Sie nicht möchten, dass es standardmäßig auf diese Reihenfolge die ganze Zeit, die Sie nur einen regulären Bereich zum Aufruf aufrufen können.

article.rb

scope :recent_first, -> {order(created_at: :desc)} 

und dann in den Index Aktion würden Sie nur

def index 
    @articles = Article.recent_first.paginate(:page => params[:page], :per_page => 10) 
end 

verwenden Wenn Sie wirklich nur diese order in dieser einen Stelle tun müssen, als Adam Lassek erwähnt in Sein Kommentar unten funktioniert auch.

def index 
    @articles = Article.order(created_at: desc).paginate(:page => params[:page], :per_page => 10) 
end 
+0

Obwohl ich weniger ein Hardliner über "default_scope" als viele bin, ist dies keine Situation, in der ich seine Verwendung empfehlen würde. Das Verwechslungspotential ist hoch, da diese Standardreihenfolge auf jeden 'Auftrags'-Bereich angeheftet wird, der dagegen aufgerufen wird, während das einfache Hinzufügen von' order (created_at: desc) 'hier keine große Sache ist. –

2

Neuen Umfang in Article Modell:

class Article < ApplicationRecord  
    scope :ordered, -> { order(created_at: :desc) } 
end 

Verwenden Sie den Umfang in der Steuerung:

def index 
    @articles = Article.ordered.paginate(:page => params[:page], :per_page => 10) 
end 
0

Oder Sie können dies einfach tun.

def index 
    @articles = Article.order('created_at desc').paginate(:page => params[:page], :per_page => 10) 
end 
Verwandte Themen