2016-05-29 34 views
1

我在我的Rails項目中有一個search控制器,它響應我的標題中的表單。現在,一切都很好,但當我搜索「某物」時,我在我的URL中獲得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)前面加括號。

如何爲我的應用程序實現「漂亮」的搜索URL?

回答

1

您可以使用您曾經嘗試過命名的路由,與:q參數,並從您的形式,我們將動態替換已輸入的搜索詞的路徑參數。

首先,像通常那樣創建表單,除了指定「查詢」作爲搜索參數。此外,請確保搜索字段字段(#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> 

現在,當用戶在搜索詞字段(#q),該查詢將看起來像這樣進入something

GET /admin/users/search/something 

而這應該只是照顧它。

+0

很好的答案,非常感謝 –