首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呈现最新文章rails 4

呈现最新文章rails 4
EN

Stack Overflow用户
提问于 2014-06-27 18:53:26
回答 2查看 70关注 0票数 0

它目前列出了我的最古老的文章在顶部,我想做相反的。我想我需要在某个地方订购它为created_at,但我还没有使它工作。我知道这很容易但我还是个新手。谢谢

目前我有

代码语言:javascript
复制
<div class="bit-75">
代码语言:javascript
复制
<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

代码语言:javascript
复制
   class Article < ActiveRecord::Base
   has_many :comments, dependent: :destroy
   validates :title, presence: true,
                length: { minimum: 5 }
   mount_uploader :image, ImageUploader                  
   end

物品控制器

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-27 18:57:43

在文章模型article.rb中,您可以设置如下所示的default_scope

代码语言:javascript
复制
default_scope -> { order('created_at DESC') }

但是,此方法将在所有页面上对此类文章进行排序。如果你只想在一个动作上像这样对它们进行排序,比如说你的def index,那么类似的事情可能会更好。

代码语言:javascript
复制
@articles = Article.order('created_at DESC')

就像ShamsulHaque在他的评论中说的那样。

这里有一个关于默认作用域的很好的读物。

更新

如果您喜欢使用scopes (如@rich says ),那么语法如下所示:

代码语言:javascript
复制
scope :recent, ->(order = 'desc') { order(created_at: order.to_sym) }

您可以选择在控制器中调用ascdesc,如下所示:

代码语言:javascript
复制
@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这样的符号。如果您不这样做,您将得到一个错误,如

代码语言:javascript
复制
Direction should be :asc or :desc

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2014-06-28 10:38:37

范围

使用default_scope是一种小禁忌 (可能会导致问题)--使用带有条件的标准范围要好得多:

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

这样你就可以打电话:

代码语言:javascript
复制
@article = Article.recent("asc")

是对@justin答案的一个很好的扩展;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24459002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档