如何将参数从form_tag传递到路由URL?

时间:2014-02-13 02:35:12

标签: ruby-on-rails

我不确定这是否可行,如果不是,请随时回复现实。

我有一个控制器Reports,它在一个名为'filtered'的方法/动作的视图中显示一个表,我想为它添加一个“过滤”属性。我的方法是添加一条额外的路线,以保持网址整洁。

 reports      GET /reports(.format)                  reports#filtered
 args_reports GET /reports/:concept/:id(.format)     reports#filtered

所以,没有参数,我会得到完整的表,如果我添加两个额外的参数(概念和id),我会根据选择的标准得到一个过滤表。当我手动执行此操作时效果很好。

现在,我想从下拉菜单框中选择:concept和:id。 :概念数据只是两个字段的选择(它们被硬编码到选择中以避免任何可能的代码注入),而:id数据由用户从下拉菜单中选取。我不太确定如何实现这个。

我正在使用HAML,目前我有以下内容:

在控制器上:

 @types=Type.all
 @type_current[:selected]=@types.last.id

在视图上:

 #rightdiv
   = form_tag(arg_reports_path(:concept => 'type')) do
     %table
       %tr
         %td Type
         %td=collection_select(:type, :id, @types.all, :id, :name, {:selected => @type_current[:selected]})
         %td=submit_tag 'Filter' 

但这告诉我,我错过了一个必需的密钥,即:id。我完全理解,但我在哪里提供这些数据?我希望用户能够选择该ID,因此我不知道此处要包含的内容,或者如何告诉form_tag从collection_select中获取id。那可能吗?或者我的解释完全错了?

另外,一个小问题。 collection_select标签将提供“type [id]”的哈希值,有没有办法让它只做“键入”而不是哈希?

提前致谢。

编辑:

我想要实现的一个例子就是让表单发送给我:

 /reports/type/9

或者,如果我们使用其他概念:

 /reports/location/7

9和7分别是类型和位置的ID。 'type'和'location'是模型Report的字段,其中有几个并包含在各自的模型中。

下拉菜单将填充表'type'和'location'的名称和id,它们在视图中一个接一个地放置。用户可以选择两者中的一个,然后将它们发送到已选择标准的过滤表中。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,/reports/reports/:concept/:id都会采取相同的行动,对吗?如果是这种情况,您可以做的只是使用/reports作为表单的操作,并将concept作为隐藏输入传递。下拉列表的名称为id。因此,当用户提交表单时,您仍会在控制器中获得params[:concept]params[:id]。这样做的缺点是网址只会显示为/reports

如果没有一点点javascript,你想要实现的目标是不可能实现的。您需要在需要用户输入的html中更改的任何内容都需要javascript。请看Changing the action of a form with javascript/jquery

collection_select标记接受它的最后一个参数(第7或第6个)html选项列表。将您的代码更改为以下内容,以便获得

collection_select :type, :id, @types.all, :id, :name, { :selected => @type_current[:selected] }, { :name => 'type' }