以非常方式格式化查询参数

时间:2016-05-29 20:56:23

标签: javascript ruby-on-rails ruby forms erb

我的Rails项目中有一个search控制器,它响应标题中的表单。现在,一切都运行良好,但当我搜索“某事”时,我在我的网址中得到admin/users/search?q=something。我正在努力使其成为更加用户友好的网址,例如admin/users/search/something

我尝试将路线从get 'search' => 'search#index'更改为get 'search/:q' => 'search#index', :as =>"search。但是,在我的表单上,它要求我明确地放置参数,这样form_tag admin_search_path, :enforce_utf8 => false, :method => :GET之类的东西不起作用,因为我需要在我的路径admin_search_path(something)前面加上括号。

如何为我的应用程序实现“漂亮”的搜索网址?

1 个答案:

答案 0 :(得分:1)

您可以使用:q参数使用您尝试过的命名路由,并从表单中,我们将使用已输入的搜索字词动态替换路由参数。

首先,像往常一样创建表单,除了将“query”指定为搜索参数。另外,请确保搜索字词字段(#q具有name属性;没有name属性的表单元素不会提交到服务器:

<%= form_tag admin_search_path("query"), :enforce_utf8 => false, :method => :get %>
    <input type="text" id="q" placeholder="Enter a search term" />
    <input type="submit" value = "Search!" />
<% end %>

用户已输入搜索字词并单击提交(或按下回车键),我们将使用实际搜索字词替换路径的query部分,以便表单发布与新的命名路线。

对于这个解决方案,有一些假设:

  • 为应用程序启用了jQuery
  • onUserSearchReady方法(或等效方法)尚不存在

根据这些假设,您可以将其添加到app/assets/javascripts/user.js文件中:

function onUserSearchReady() {
    $.submit(function(event) {
        var form = $("form");
        var action = form.attr("action");
        var search_terms = form.find("#q").val().trim();

        if (search_terms.length > 0) {
            var new_action = action.replace(/query/, encodeURIComponent(search_terms));

            form.attr("action", new_action);
        } else {
            event.preventDefault();
        }
    });
};

然后,在search视图中,将其添加到视图源的底部:

<script>
jQuery(document).ready(onUserSearchReady);
// Also register appropriate TurboLinks ready callbacks, if using TurboLinks...
// jQuery(document).on('page:load', onUserSearchReady);
// jQuery(document).on('page:restore', onUserSearchReady);
</script>

现在,当用户在搜索字词字段something中输入#q时,查询将如下所示:

GET /admin/users/search/something

这应该只是照顾它。