渲染最近的文章rails 4

时间:2014-06-27 18:53:27

标签: ruby-on-rails

它目前列出我最顶层的文章,我想做相反的事情。我想我需要在某处将它命名为created_at,但我还没有让它工作。我知道这很容易,但我还是个新手。感谢

目前我有

<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

2 个答案:

答案 0 :(得分: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

要解释一下,@ rich包括to_sym将字符串'desc''asc'转换为:desc:asc之类的符号。如果你没有这样做,你会收到类似

的错误
Direction should be :asc or :desc

希望这会有所帮助。

答案 1 :(得分: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答案的一个很好的扩展;)