Rails太阳黑子过滤器/方面问题与URL?删除旧的“获取参数”

时间:2014-01-06 23:50:37

标签: ruby-on-rails solr sunspot

我正在尝试理解并在我的Rails 4.0项目中设置Sunspot gem。我正在尝试在我的开源项目BTC-Stores中实现更好的搜索,但我对如何使用Sunspot这样做感到困惑。

目前,我有以下架构(型号):

档案:

# Relationship with Category
belongs_to :category 
accepts_nested_attributes_for :category

searchable do
    text :name, :description
    integer :category_id
    string  :sort_name do # why I have this here? I dont understand this code
          name.downcase.gsub(/^(an?|the)/, '')
    end
end

控制器:

@search = Item.search do
    fulltext params[:search] do
      boost_fields :name => 2.0
    end

    # With category
    facet :category_id
    with(:category_id, params[:category_id]) if params[:category_id].present?

    # Kaminari
    paginate :page => params[:page], :per_page => 8
end

@items = @search.results

# Here a quick fix to show Category Name, instead of Category ID to user.
@items_categories = []
@search.facet(:category_id).rows.each do |row|
    @items_categories << [Category.find_by_id(row.value), row.count] 
end 
@items_categories = @items_categories.sort_by { |e| e[0].name } 

查看:

<% @items_categories.each do |category| %>
    <div class="country-item">
        <a href="#" class="country-row">
            <div class="country">
              <% if params[:category_id].blank? %>
                <%= link_to category[0].name, :category_id => category[0].id  %> (<%= category[1] %>)
              <% else %>
                <%= category[0].name %>(<%= link_to "remove", :category_id => nil %>)
              <% end %>
            </div>
        </a>
    </div>
 <% end %>

问题:

当我搜索某些内容时,我会得到所需的结果。看看类别,主要是在URL:

enter image description here


现在,如果我点击任何列出的类别,而不是将类别添加到“获取”参数,这将删除旧的参数,然后添加category_id参数。

现在我的网址为http://localhost:3000/stores?category_id=6而不是http://localhost:3000/stores?utf8=%E2%9C%93&search=bitcoin&category_id=6。看:

enter image description here

那么,我该怎么办?另外,如果您发现我的代码中存在问题以及可以做得更好的事情,请告诉我。我阅读了所有Sunspot documentationRailsCast by Ryan Bates,但我不明白我是如何通过“正确的方式”做事的。

1 个答案:

答案 0 :(得分:1)

this answer

中提示

而不是

<%= link_to category[0].name, :category_id => category[0].id  %> (<%= category[1] %>)

尝试使用

<%= link_to category[0].name, request.parameters.merge({:category_id => category[0].id})  %> (<%= category[1] %>)

这会将类别ID附加到现有的get参数。

然而这也有不利之处 - 由于您使用Facets,向下钻取会保留附加参数,默认情况下最终可能会执行AND。即

之类的东西
http://localhost:3000/stores?utf8=%E2%9C%93&search=bitcoin&category_id=6&category_id=7

因此,除非您希望默认使用向下钻取功能,否则您可能需要调整params合并逻辑。