2016-10-11 33 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

相关问题