扶手:依PARAMS查询?

我使用运行一个简单的找到所有与willpaginate分页,但我也想拥有查询排序用户。 浮现在脑海的第一个解决方案是只使用一个PARAMS [:排序]

http://localhost:3000/posts/?sort=created_at+DESC @posts = Post.paginate :page => params[:page], :order => params[:sort]

但他的做法的问题是,查询违约由ID排序,我希望它是created_at。

这是一个安全的方法来整理和有没有办法默认为created_at?

--------------解决方案-------------

保险业监督€™D使用了一个名为范围提供的默认顺序(自Rails的2.1)。

有啊€™Ð添加范围在Post模型:

named_scope :ordered, lambda {|*args| {:order => (args.first || 'created_at DESC')} }

然后,您可以拨打:

@posts = Post.ordered.paginate :page => params[:page]

上面的例子将使用默认顺序从named_scope created_at DESC但你也可以提供一个不同的:

@posts = Post.ordered('title ASC').paginate :page => params[:page]

你可以用与Romulo’的建议:

sort_params = { "by_date" => "created_at", "by_name" => "name" }
@posts = Post.ordered(sort_params[params[:sort]]).paginate :page => params[:page]

如果params[:sort]伊斯纳€™吨中发现sort_params和收益nil ,然后named_scope将回退到使用默认顺序。

Railscasts对named_scopes一些伟大的信息。

一般来说,为了提供缺省值散列和Hash状物体的方法是使用fetch

params.fetch(:sort){ :created_at }

很多人只使用||不过:

params[:sort] || :created_at

我更喜欢fetch自己作为更加明确,再加上它不破时, false是一个合法的值。

我喜欢这个成语:

@posts = Post.paginate :page=>page, :order=>order
...

def page
params[:page] || 1
end

def order
params[:order] || 'created_at ASC'
end

Ruby的成语设置默认是:

@posts = Post.paginate :page => params[:page], :order => params[:sort] || "created_at"

但是这种方法并不安全。 该PAGINATE方法不会像参数打扰"created_at; DROP DATABASE mydatabase;" 相反,你可以使用有效的排序参数字典(未经测试):

sort_params = { "by_date" => "created_at", "by_name" => "name" }

@posts = Post.paginate :page => params[:page], :order => sort_params[params[:sort] || "by_date"]

使该URI变为:

http://localhost:3000/posts/?sort=by_date

分类:Ruby on Rails的 时间:2015-03-15 人气:2
本文关键词: 红宝石,Ruby on Rails的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.654 (s). 10 q(s)