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

时间:2010-01-30 12:47:08

标签: ruby-on-rails forms parameters named-routing

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

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

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

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

<% form_tag(search_path, :method => 'get') do %>
  <%= text_field_tag(:first_name) %>
  <%= text_field_tag(:last_name) %>
  <%= submit_tag("Search") %>
<% end %>

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

  

search_url无法从{:action =&gt;“search”,:controller =&gt;“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

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

2 个答案:

答案 0 :(得分:4)

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,从提交中重新获取参数,然后重定向到正确的路径。

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

答案 1 :(得分:2)

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

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

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

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

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