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]
...
等等
编辑 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]
...
等等