2014-06-27 72 views
0

它目前列出我最古老的文章在頂部,我想做相反的事情。我想我需要將它命名爲created_at,但我還沒有完成它的工作。我知道這很容易,但我仍然是一個新手。由於呈現最近的文章軌道4

目前我有

<div class="bit-75"> 
<h2 id="title"><%= link_to article.title, article_path(article) %></h2> 
<br> 

<ul id="article-links"> 
    <div id="article-image"><%= image_tag article.image_url %></div> 
    <br> 
    <li id="article-text"><%= article.text %></li> 
<br> 
<%= article.created_at %> 
<br> 

<% if admin_signed_in? %> 
    <li><%= link_to 'Edit',   edit_article_path(article) %></li> 
    <li><%= link_to 'Destroy',  article_path(article), 
       method: :delete, data: { confirm: 'Are you sure?'} %></li> 
    <li><%= link_to 'New article', new_article_path %></li> 
<% else %>     
    <li><%= link_to 'Make a Comment', article_path(article) %></li>    
</ul> 
<% end %> 

article.rb

class Article < ActiveRecord::Base 
    has_many :comments, dependent: :destroy 
    validates :title, presence: true, 
       length: { minimum: 5 } 
    mount_uploader :image, ImageUploader     
    end 

文章控制器

def new 
@article = Article.new 
end 

def index 
@article = Article.all 
end 

def create 
@article = Article.new(article_params) 

    if @article.save 
    redirect_to @article 
else 
    render 'new' 
end 
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 show 
    @article = Article.find(params[:id]) 
end 

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

redirect_to articles_path 
end 
+0

嘗試索引操作中的Article.order(「created_at DESC」)' –

+0

謝謝Shamsul。我早些時候嘗試過,但我認爲我犯了一個語法錯誤,但沒有奏效。 default_scope確實有效。謝謝您的幫助。 –

回答

2

在您的文章模型,article.rb,你可以設置一個default_scope這樣的:

default_scope -> { order('created_at DESC') } 

但是,這種方法會在所有頁面類似這樣的物品進行分類。如果你只需要想在一個動作中像這樣排序它們,比如說你的def index,那麼類似這樣的東西可能會更好。

@articles = Article.order('created_at DESC') 

像@ShamsulHaque在他的評論中說的。

這是一個很好的閱讀關於default scopes

更新

如果你喜歡使用scopes,像@rich說,那麼語法是這樣的:

scope :recent, ->(order = 'desc') { order(created_at: order.to_sym) } 

,你將有選擇,在你的控制器,以無論是打電話還是ascdesc如此:

@articles = Article.recent('asc') 
@articles = Article.recent('desc') # although we defaulted to 'desc', so really only need Article.recent 

來解釋包含to_sym以將字符串'desc''asc'轉換爲符號,如:desc:asc。如果你沒有這樣做,你會得到一個錯誤,如

Direction should be :asc or :desc 

希望這會有所幫助。

+0

Justin工作。謝謝,我感謝幫助。並感謝您的鏈接。我會看一看。 –

+1

作爲備用語法,您還可以使用'order(created_at::desc)'。 –

+0

甚至是'order(:created_at =>:desc)'lol :) –

1

Scopes

使用default_scopelittle taboo(可能會造成問題) - 你會更好的使用標準範圍與條件:

#app/models/article.rb 
Class Article < ActiveRecord::Base 
    scope :recent, (order = "desc") -> { where created_at: order.to_sym} 
end 

這將允許您撥打:

@article = Article.recent("asc") 

@justin的回答很好的延伸;)

+1

感謝您輸入Rich。 –

+0

True @rich,但應該是'scope:recent, - >(order ='desc'){order(created_at:order.to_sym)}':) –