6

我正在尝试在 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=>"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作为搜索的结果。多谢你们!

4

2 回答 2

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

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

于 2010-01-30T13:23:31.533 回答
2

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

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

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

所以不幸的是,你想要做的事情在普通的 Rails 应用程序中是不可能的。

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

于 2010-01-30T13:00:46.703 回答