更改post循环排序的链接

我正试图在我的页面中实现链接,允许我更改我的post显示的顺序。类似于Reddit上的’Recent’,’Hot’和’Oldest’。

我目前默认拥有

PostsController.rb

def index @posts = Post.order('created_at DESC').all.paginate(page: params[:page], per_page: 20) end 

我如何添加链接到一个方法来反转post到ASC的流量,或者显示像模型上的特定列下降的post,如视图?

乔恩

我将在模型中创建一些范围和方法来处理所有可能性,

 # Post.rb scope :recent, -> { order(created_at: :desc) } scope :hot, -> { order(something: :desc) } scope :oldest, -> { order(created_at: :asc) } def self.sort_by(sort_param) case sort_param when 'recent' recent when 'hot' hot when 'oldest' oldest else all end end # controller @posts = Post.sort_by(params[:order]).paginate(page: params[:page], per_page: 20) 

由于我是白名单,我真的不需要清理,任何错误的参数都会返回默认顺序。

如果需要,可以使用#send并将方法名称添加到白名单数组,但是您需要确保范围存在

 def self.sort_by(sort_param) if %w(recent hot oldest).include? sort_param send sort_param else all end end 

在你的应用程序中使用will_paginate gem进行双向Sorting和Paginate。请访问此链接以实现它https://github.com/mislav/will_paginate 。

首先,你想删除all以便分页更好。

  def index @posts = Post.order('created_at DESC').paginate(page: params[:page], per_page: 20) end 

然后您可以使用变量来控制订单。 重要的是在传递给mysql之前进行清理。

  def index sort_by = ActiveRecord::Base::sanitize(params.permit(:sort_by)) @posts = Post.order(sort_by).paginate(page: params[:page], per_page: 20) end