如果您在form_for 中设置一个值,您现在拥有它,它将是表单发送到的地址的一部分,因此您将能够通过params[:search] 在控制器中获取它。
您还可以为用户创建一个文本字段(文本区域、选择框等)来填充值,例如described in APIDock。你甚至可以有一个隐藏的字段,它不会显示给用户,但仍然与表单一起提交。无论如何,它都可以通过params[:search] 获得。
编辑 另一种理解您的问题的方式是,您希望根据用户键入的任何内容动态传递form_for :url 中的search 参数。在这种情况下,我可以想到三个解决方案:
选项 1。将表单提交到独立于:search 的地方并从那里重定向:
表格:form_for :search, :url=>{:controller=>"search", :action=>"handle"}
SearchController:
def handle
case params[:search] of
when :foo then redirect_to some_path(params[:search], ...)
when :bar then redirect_to other_path(params[:search], ...)
end
end
缺点是不能进行 POST 重定向,只能进行 GET。优点是表格在一个地方处理。既然是 - 为什么不包括整个处理并跳过重定向?这是我会考虑的一个选择。
选项 2。在提交之前使用一些 JavaScript 更改form HTML 元素的action 参数。
选项 3。使用一些 JavaScript 根据之前的选择生成一个表单。
在这种情况下,有两种形式,其中只有一种是用户可通过按钮提交的。第一个表单只包含一个下拉框(文本框、单选按钮)和一个 JavaScript 表单观察器。根据此观察者显示正确表单的值 - 请注意,在呈现表单时,用户输入的 :search 值在此时是已知的。
当然,如果用户可用的:search 选项的选择有限,则除了第一种形式之外,您还可以使用链接集合。选项 3 在性能方面可能并不理想,但应该足够好,以便以后扩展、理解和重用它。
不过,可能还有其他方法可以做到这一点。