我正在尝试在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作为搜索的结果。谢谢你们!
答案 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
指定所有参数的原因。但是上面的例子不会像你期望的那样工作。
那么你能做什么?
创建包含action='/'
的空表单,并在提交前使用js将其替换为输入文本字段的内容。
创建另一个路线,例如/search
,从提交中重新获取参数,然后重定向到正确的路径。
可能还有一些更好的方法可以做到这一点;)
答案 1 :(得分:2)
首先,search_path
实际上是一个方法,它接受选项的哈希值。这种方法应该接收:first_name
和:last_name
。
其次,浏览器只能提交表单参数作为POST请求的主体,或者作为查询字符串参数(对于任何类型的请求方法)。因此,遗憾的是浏览器的本机提交功能无法生成这种URL。
另一种思考方式:你在这里做的是用一个URL填充表单标签的action属性。在构建表单时,Rails需要一个完整的URL。因此,在调用表单助手时,需要指定路由中的所有参数,而不是在下一个POST请求时。
很遗憾,在普通的Rails应用程序中,您尝试做的事情是不可能的。
(如果你真的想,你可以通过编写自己的表单助手和一些Javascript来替换浏览器的本机提交功能来完成它。然后Javascript将根据表单字段构建该URL。不过,我反对它。)