我不确定这是否可行,如果不是,请随时回复现实。
我有一个控制器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,它们在视图中一个接一个地放置。用户可以选择两者中的一个,然后将它们发送到已选择标准的过滤表中。
答案 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' }