Rails为索引

时间:2017-08-27 18:29:58

标签: ruby-on-rails

我正在处理过滤系统,并与我加载搜索结果的方式发生冲突。我使用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 %>

但它仍然适用于控制器中的索引操作。

1 个答案:

答案 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