新手问题 form_tag 做搜索,有什么办法可以不在 URL 上显示那么多信息

QueXuQ · 2013年11月04日 · 最后由 wppurking 回复于 2013年11月05日 · 1980 次阅读

我想做一个搜索的 form,但是这个 form 的内容比较多,例如如果我想搜索 Order model 的东西。 然后 form tag 涉及:

价格范围(小)
价格范围(大)
订单号码
订单类型
订单内容数量范围(小)
订单内容数量范围(大)
...

然后 controller 里就比较复杂,就得写成:

def index
  @orders = Order.where(
                        price: (params[:价格范围].to_i).. (params[:价格范围].to_i),
                        number: 订单号码,
                        category: 订单类型,
                        order_product: (params[:订单内容数量范围].to_i).. (params[:订单内容数量范围].to_i),
                        ...
                        )
end

其实 index 的 action 复杂倒关系不大,可是这样做,url 变得非常的长:

127.0.0.1:3000/orders?价格范围(小)=1&价格范围(大)=5&订单号码=22312312&订单类型=3...........

然后想到还有一种方式就是,默认项就都不发到服务器了,url 就会变得短一点,但是问题是 controller 就变得复杂,需要判断各种params为空的情况。 还有一种方式就是做 post 请求,但是这样刷新就没有了。 不知道我想了解一下,如果做一个复杂的搜索框,用什么方式做,是最好的实践呢?

要么用 POST 请求,要么就不要介意 URL 后面参数的长度,用户不会介意的,比如 Taobao, Google 的搜索 URL

可以做 post, 在返回结果的后,将 post 请求的值重新传到页面填充上原来的 form 也可以啊。

你这样的搜索,我想搜索完成跳转后那个页面还是会有搜索框的吧?

params key 是用中文?改成英文。

#4 楼 @lemayi 这个页面的 url 不能理解是怎么生成出来的,好像有点复杂。

#3 楼 @Rei key 是用英文,这用中文只是举个例子而已。

#2 楼 @wppurking 可以填充到本来的 form 里,但是如果还涉及一个分页的话,post 的话 form 里有值也用不上呢。

#5 楼 @QueXuQ 也就是你把参数固定成一个格式:1-2-3-4-5-6-7-8.1 代表 a,2 代表 b。。。然后分析下就可以了。这样一般比较有利于 seo

恩,你可以直接将搜索的参数 post 发送给服务器,而不使用在 url 上拼参数的形式。

#7 楼 @QueXuQ 这个就有点类似 rails 中 params.permit 的作用。前端可以传递很多值到后端,有用的没用的,但后端只会对需要的值做响应,不要得过滤掉。

过滤,又可以像 rails 的 params.permit 直接给舍弃,也可以怎样进来怎样返回但不做处理。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号