代码之家  ›  专栏  ›  技术社区  ›  Stewart Johnson

使用带参数和表单标记的命名路由

  •  6
  • Stewart Johnson  · 技术社区  · 14 年前

    我试图在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]-它们都满足吗?

    我错过了什么?我认为表单中定义的字段将自动与路由参数链接起来。- -

    更新:

    我知道搜索路径是在表单显示之前生成的,因此无法更新。事后看来很明显!

    我改变了路线:

    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
    

    这都是一种享受!这里的主要目标是从 名称 搜索的结果是命名的路由。谢谢大家!

    2 回复  |  直到 14 年前
        1
  •  4
  •   klew    14 年前

    form_for 生成表单,并且必须指定创建表单所需的所有参数 search_path ,所以应该是:

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

    或者至少像这样。HTML标签 form 具有参数 action='/some/url' 这就是为什么您必须为 搜索路径 . 但是上面的例子不会像您期望的那样工作。

    你能做什么?

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

    2. 例如,创建另一条路线 /search 它从submit接收参数,然后重定向到正确的路径。

    也许还有更好的方法可以做到;()

        2
  •  2
  •   Stéphan Kochen    14 年前

    第一, search_path 实际上是一个方法,它接受选项的散列值。这是应该接受的方法 :first_name :last_name .

    其次,浏览器只能将表单参数作为发布请求的主体提交,或者 查询字符串 参数(用于任何类型的请求方法)。所以不幸的是,浏览器的原生提交函数无法生成这种URL。

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

    所以不幸的是,在一个普通的Rails应用程序中,您试图做的事情是不可能的。

    (如果您真的想这样做,您可以通过编写自己的表单帮助程序和一点JavaScript来替换浏览器的原生提交功能来实现这一点。然后,JavaScript将基于表单字段构造该URL。不过,我会反对的。)