使用带参数和form_tag的命名路由

我正在尝试在Rails中创建一个简单的搜索表单,但我想我错过了一些东西。

我有一个命名的搜索路线:

map.search ":first_name/:last_name", :controller => "home", :action => "search" 

我正在尝试在我的搜索表单中使用它:

  'get') do %>     

但是当我加载搜索表单时,我得到一个ActionController :: RoutingError:

search_url无法从{:action =>“search”,:controller =>“home”}生成 – 您可能有不明确的路线,或者您可能需要为此路线提供其他参数。 content_url具有以下必需参数:[:first_name,:last_name] – 它们是否都满足?

我错过了什么? 我认为我的表单中定义的字段会自动与我的路由参数相关联。 : – /

更新:

我知道search_path是在现在显示表单之前生成的,因此无法更新。 后见之明显而易见!

我改变了路线:

 map.search 'search', :controller => "home", :action => "search" map.name ':first_name/:last_name', :controller => "home", :action => "name" 

现在search操作就是:

 def search redirect_to name_path(params) end 

这一切都有效! 这里的主要目标是从名为route的名称中获取该URL作为搜索的结果。 多谢你们!

form_for生成表单,它必须指定创建search_path所需的所有参数,因此它应如下所示:

 <% form_tag(search_path, :firstname => 'some_text', :lastname => 'some_text', :method => 'get') do %> 

或者至少是这样的。 HTML标记form具有参数action='/some/url' ,这就是为什么必须为search_path指定所有参数的原因。 但是上面的例子不会像你预期的那样工作。

那么你能做什么?

  1. 创建具有action='/'空表单,并在提交之前使用js将其替换为输入文本字段的内容。

  2. 在示例/search上创建另一个路径,从提交中重新获取参数,然后重定向到正确的路径。

可能还有一些更好的方法来做到这一点;)

首先, search_path实际上是一个方法,它接受选项的哈希。 这个方法应该接收:first_name:last_name

其次,浏览器只能提交表单参数作为POST请求的主体,或者作为查询字符串参数(对于任何类型的请求方法)。 所以很遗憾,浏览器的本机提交function无法生成那种URL。

另一种思考方式:你在这里做的是用URL填充表单标签的action属性。 在构建表单时,Rails需要一个完整的URL。 因此,在调用表单助手时,需要指定路由中的所有参数,而不是在下一个POST请求时。

很遗憾,在普通的Rails应用程序中,您尝试做的事情是不可能的。

(如果你真的想,你可以通过编写自己的表单助手和一些Javascript来替换浏览器的本机提交function来完成它。然后Javascript将根据表单字段构建该URL。我会但是反对它。)

Interesting Posts