更改帖子循环排序的链接

时间:2015-04-02 13:35:44

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我试图在我的页面中设置链接,允许我更改帖子显示的顺序。类似于' Recent',' Hot'和#“最古老的'在Reddit上。

我目前默认

PostsController.rb

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

我如何添加指向方法的链接以反转帖子到ASC的流量,或者显示模型上特定列下降的帖子,如视图?

乔恩

3 个答案:

答案 0 :(得分:2)

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

# 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

答案 1 :(得分:0)

在您的应用中使用will_paginate gem Sorting双向Paginate。访问此链接以实施https://github.com/mislav/will_paginate

答案 2 :(得分:0)

首先,您要删除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