2016-10-11 34 views
0

EDIT 2的Rails 4.2使用的form_tag創建搜索,但沒有使用查詢字符串PARAMS

相關問題here

編輯

這是我需要提交路線:

get '/s/:term', controller: :products, action: :search, as: :search_products 

我有這樣的一個搜索表單:

<%= form_tag(search_products_path, :method => "get", id: "search-form", name: "f1", enforce_utf8: false) do %> 
    <div class="input-group"> 
     <%= text_field_tag :search, params[:search], placeholder: "Search products", class: "form-control", name: "search" %> 
     <div class="input-group-btn"> 
     <button class="btn btn-secondary"> 
      <span class="glyphicon glyphicon-search"></span> 
     </button> 
     </div> 
    </div> 
    <% end %> 

但是這創造了這樣的網址:

domain/s?search=[user input] 

我需要的URL是這樣,而不是:

domain/s/[user_input] 

是我不知道這是不是下面的Rails約定。在這一點上,我無所謂,我只需要弄明白。

感謝。

+0

這不是Rails標準,它是HTML/HTTP標準 - 問題在於你的表單使用'get'而不是'post',這就是GET請求的標準URL ... –

+0

我知道這不是標準。我在這個問題上說。我已經添加了一個編輯來顯示我嘗試使用此表單創建的路線。 – rmcsharry

+0

它不能是POST,因爲它必須是可以緩存的「永久鏈接」。注意它是一個SEARCH表單,所以它不會在服務器上創建任何東西,只是檢索一些搜索結果。 – rmcsharry

回答

0

承蒙@TarynEast和我的第二個編輯鏈接的其他問題的意見,我意識到我是非常困惑 - 所以謝謝泰倫!

這具有2個獨立的動作/路由來完成,這樣的:

post '/s', controller: :products, action: :search, as: :search_products 
    get '/s/:search', controller: :products, action: :index, as: search_results_path 

無論用戶輸入,然後通過貼的形式到搜索動作。

下面的形式:

<%= form_tag(search_products_path, :method => "post", id: "search-form", name: "f1", enforce_utf8: false) do %> 
    <div class="input-group"> 
     <%= text_field_tag :search, params[:search], placeholder: "Search products", class: "form-control", name: "search" %> 
     <div class="input-group-btn"> 
     <button class="btn btn-secondary"> 
      <span class="glyphicon glyphicon-search"></span> 
     </button> 
     </div> 
    </div> 
    <% end %> 

products#search行動只是做了重新定位:

def search 
    # ORIGINALLY: redirect_to "/s/#{params[:search]}" 
    redirect_to search_results_path(params[:search]) 
    end 

然後,我們可以提取:search PARAM,並用它來搜索模型,像這樣:

def index 
    if params[:search] && !params[:search].blank? 
     @products = Product.search params[:search] 
    ... 

etc

+1

請記住在搜索項中使用有趣的字符(如空格和斜線)進行測試。現在,如果你搜索「foo bar」,你會得到一個錯誤,因爲它會產生一個無效的網址。命名路線並使用rails路徑助手(例如'redirect_to my_search_path(params [:search])'應該爲你處理這個問題。 – gmcnaughton

+0

@gmcnaughton非常感謝你爲'gotcha':)答案更新以反映你的聖人忠告 – rmcsharry

2

由於表單提交的url需要是動態的,因此無法僅使用form_tag來完成此操作。

$("#search-form").submit(function(evt) { 
    var term = $("#search-form input[name='search']").val(); 
    $(this).attr('action', '/s/' + encodeURIComponent(term)); 
}); 

這將導致形式提交:?域/ S/[用戶輸入]搜索= [用戶輸入]

你可以進一步防止搜索?但它可以使用JavaScript來實現=通過忽略該字段中的name屬性(參見https://stackoverflow.com/a/3008071/157943)來包含在URL中的參數,儘管如此,您需要爲其提供一個id或其他方式,以便上面的JavaScript代碼段找到它。

+1

謝謝,但我認爲有沒有使用JS的方式,因爲我剛剛發現一個相關的問題。我需要兩個單獨的控制器操作並將表單更改爲POST。看到我的新編輯。 – rmcsharry

相關問題