Ruby on Rails:记住状态和RESTfulness

时间:2013-02-17 06:11:29

标签: ruby-on-rails ruby rest

我是Ruby和Rails的新手。

我做了一个简单的应用程序,其中索引页面显示一个Cars表,其中包含make,model和type(sportscar,SUV,luxury)列。

我已经做到了,所以我可以点击列标题并按该列排序

我还在表格上方添加了一个表格,其中包含每种车型的复选框,用户可以选中/取消选中复选框并单击“提交”,表格将仅显示已检查类型的车辆。

我希望能够做的是按一些列排序,然后选中一些框/点击提交并显示结果,列表仍然排序并过滤。

现在,我可以排序或过滤,但如果我执行一个操作,我的应用程序会忘记上一个操作。

执行此操作的RESTful方式是什么?

我应该在会话哈希中保留'settings',并在每次用户发出新的HTTP请求时构建一个URI吗?

2 个答案:

答案 0 :(得分:1)

在请求URI中包含排序/过滤器参数有什么问题?例如,当您为“honda”的make提交过滤器表单时,uri将类似于/cars?filter[make]=honda。如果您还包含排序选项,则uri可以是/cars?filter[make]=honda&sort_by=make

在您的控制器中,您可以通过params hash访问这些:

class CarsController < ApplicationController
  def index
    @filter = params[:filter]  || {}
    @order  = params[:sort_by] || "created_at"

    @cars = Car.where(@filter).order(@order)
  end
end

您可以通过在视图中包含路径助手中的参数来生成这些uri:

link_to "Only show hondas", cars_path(:sort_by => @order, :filter => {:make => "honda"})
link_to "Sort by year",     cars_path(:sort_by => :year,  :filter => @filter)

这样,除非您明确更改请求,否则@filter和@order将在请求之间“保持”。 (这些链接不是DRY ......你应该动态生成它们。)

答案 1 :(得分:0)

只要用户登录,会话哈希中保存的任何数据都是可用的。当前URI的大小并不重要。如果您想使用params哈希,则只需要破解URI。

因此,每当选择排序操作时,您都应该执行session[:sortBy] = :make之类的操作。然后,无论您当前在控制器中访问params[:sortBy],请改为session[:sortBy]

我当然猜测你的符号是什么样的。允许我们看一些你自己的代码会有所帮助。