Rails 4.2 使用 form_tag 创建搜索但不使用查询字符串参数

Rails 4.2 use form_tag to create search but without using query string params

编辑 2

相关问题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 %> 

但这会创建这样的 url:

domain/s?search=[user input]

我需要 URL 变成这样:

domain/s/[user_input]

是的,我知道这不符合 Rails 惯例。我现在不在乎,我只需要弄清楚。

谢谢。

仅使用 form_tag 无法做到这一点,因为表单提交到的 url 需要是动态的。但是可以使用 javascript 来完成:

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

这将导致表单提交至:domain/s/[用户输入]?search=[用户输入]

您可以通过从字段中省略 name 属性来进一步防止 ?search= 参数包含在 url 中(请参阅 ),尽管这样您会需要为上面的 javascript 片段提供 id 或其他方式来定位它。

感谢@TarynEast 的评论和我第二次编辑中链接的另一个问题,我意识到我 非常 困惑 - 所以谢谢塔林!

这必须在 2 个单独的 actions/routes 中完成,如下所示:

  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 参数并使用它来搜索模型,如下所示:

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

等等