我试图在我的页面中设置链接,允许我更改帖子显示的顺序。类似于' Recent',' Hot'和#“最古老的'在Reddit上。
我目前默认
PostsController.rb
def index
@posts = Post.order('created_at DESC').all.paginate(page: params[:page], per_page: 20)
end
我如何添加指向方法的链接以反转帖子到ASC的流量,或者显示模型上特定列下降的帖子,如视图?
乔恩
答案 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