我正在处理过滤系统,并与我加载搜索结果的方式发生冲突。我使用jquery-infinite-scroll插件在用户滚动时加载更多结果。因此我有一个index.js.erb,它附加了额外的结果:
$("#recipes").append("<%= escape_javascript(render 'recipe_card') %>");
<% if @recipes.last_page? %>
$('#paginator').html("No More Recipes");
<% else %>
$('#paginator').html('<%= escape_javascript(link_to_next_page(@recipes, "Next Page", remote: true).to_s) %>');
<% end %>
当我尝试实现我的过滤器时出现问题。我使用带有复选框的表单作为搜索条件。这是form_tag:
<%= form_tag(recipes_path, :method => "get", id: "Filters", remote: true, html: {class: "form-horizontal"}) do %>
问题是它使用与加载滚动的kaminari页面相同的索引路径。因此,它会附加过滤后的结果,而不是替换它们。我无法弄清楚如何添加路由以使用不同的控制器操作。我已将此添加到我的控制器中:
def filter
@recipes = RecipeSearch.new(query: params[:search], options: params).search
end
然后创建了一个filter.js.erb文件:
$("#recipes").html("<%= escape_javascript(render 'recipe_card') %>");
<% if @recipes.last_page? %>
$('#paginator').html("No More Recipes");
<% else %>
$('#paginator').html('<%= escape_javascript(link_to_next_page(@recipes, "Next Page", remote: true).to_s) %>');
<% end %>
无法弄清楚如何更改form_tag以路由到该操作......我试过了:
<%= form_tag(recipes_path, url: {action: 'filter'}, :method => "get", id: "Filters", remote: true, html: {class: "form-horizontal"}) do %>
但它仍然适用于控制器中的索引操作。
答案 0 :(得分:1)
form_tag
的网址由recipes_path
参数提供,因此,根据您设置路线的方式,您需要更改该网址。
例如,如果您设置路线,如:
resources :recipes do
get :filter, on: :collection
end
您应该使用filter_recipes_path
而不是recipes_path
。否则,您可以使用as:
选项创建命名助手。最后,如果您不想要该路线的命名助手,您可以使用:url_for
。所以下列之一应该有效:
form_tag(filter_recipes_path, method: 'get', ...) do
或
form_tag(url_for(controller: :recipes, action: :filter), method: 'get' ...) do