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

Ste*_*son 6 forms parameters ruby-on-rails named-routing

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

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

map.search ":first_name/:last_name", :controller => "home", :action => "search"
Run Code Online (Sandbox Code Playgroud)

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

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

但是当我加载搜索表单时,我得到一个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"
Run Code Online (Sandbox Code Playgroud)

现在这个search动作就是:

def search
  redirect_to name_path(params)
end
Run Code Online (Sandbox Code Playgroud)

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

kle*_*lew 4

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

<% form_tag(search_path, :firstname => 'some_text', :lastname => 'some_text', :method => 'get') do %>
Run Code Online (Sandbox Code Playgroud)

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

那么你能做什么呢?

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

  2. 创建另一个路由,例如/search从提交接收参数,然后重定向到正确的路径。

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