【问题标题】:Using named routes with parameters and form_tag使用带有参数和 form_tag 的命名路由
【发布时间】:2010-01-30 12:47:08
【问题描述】:

我正在尝试在 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

这一切都是一种享受!这里的主要目标是从名为 name 的路由中获取该 URL 作为搜索的结果。谢谢大家!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我刚刚使用您的选项 #2 - 我创建了另一个路线和另一个动作。谢谢!
    • 或许双管齐下会更好。所以这样做 2. 默认方式,如果 js 正在工作,然后用 js 更改 action - 这样它就可以在不重定向的情况下工作。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • HTML 表单完全可以提交 HTTP GET 参数。例如,在您搜索 Google 时查看 URL。
    • 但他要做的不是查询字符串参数,它们是URL路径的一部分。
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多