【问题标题】:Rails How to make a filter linkRails 如何制作过滤链接
【发布时间】:2018-06-29 08:53:23
【问题描述】:

我正在 Rails 中进行多面搜索。它来自我之前的问题:Rails: How to use facets with search results

我能做的是使用范围来获取与搜索结果相关的所有方面,如图所示:

我目前的工作是使用构面文本作为链接,为我们已经获得的搜索结果添加额外的参数。

对此我有两个问题:

  1. 如何获取现有搜索 URL 并添加链接以在单击链接时添加/合并参数。我正在使用不起作用的参数合并。 代码如下。
    <h3 style = "color:#7C064D; text-align: center;"><strong>CYLINDER</strong></h3>

    <%- @listings_cylinder.each do |key, value| -%>
        <h5 style = "color:#F00000; text-align: left;"><strong><%= link_to "#{key.upcase if key} (#{value})" , search_listings_path(params.merge(:cylinder => "#{key}")) %> </strong></h5>
    <% end %>
  1. 如何同时使用多个过滤器。我想要的是当点击一个方面链接时,它应该在下面添加一个小过滤器链接 图片中的排序链接。当用户想要撤消该构面过滤器时 效果,他点击那个小链接上的 X 并进入搜索 不带过滤器的查询。与hotels.com 或 priceline.com 如图所示:

注意:我不想使用 solr/elaticsearch,因为这不是最好的用例。我想从头开始学习。我已经能够使用简单的导轨构建构面文本。只要有一点帮助,我就能做到。

代码:

我正在使用的范围:

    scope :listing_search_cities, -> {group(:city).count}
    scope :listing_search_body_type, -> {group(:bodytype).count}
    scope :listing_search_states, -> {group(:state).count}
    scope :listing_search_newused, -> {group(:NewUsed).count}
    scope :listing_search_transmission, -> {group(:transmission).count}
    scope :listing_search_cylinder, -> {group(:cylinder).count}
    scope :listing_search_fuel, -> {group(:fuel).count}
    scope :listing_search_drive, -> {group(:drive).count}
    scope :listing_search_trim, -> {group(:trim).count}
    scope :listing_search_color, -> {group(:color).count}
    scope :listing_search_year, -> {group(:year).count}
    scope :listing_search_interiorcolor, -> {group(:interiorcolor).count}

在控制器搜索动作中,我使用的是:

def search                  
    @listings = Listing.search(params)  
    @listings_cities = @listings.listing_search_cities  
    @listings_bodytype = @listings.listing_search_body_type
    @listings_states = @listings.listing_search_states

    @listings_newused = @listings.listing_search_newused
    @listings_cylinder = @listings.listing_search_cylinder
    @listings_transmission = @listings.listing_search_transmission
    @listings_drive = @listings.listing_search_drive
    @listings_trim = @listings.listing_search_trim

    @listings_fuel = @listings.listing_search_fuel

    @listings_color = @listings.listing_search_color
    @listings_interiorcolor = @listings.listing_search_interiorcolor
    @listings_year = @listings.listing_search_year

end

在视图中,我正在使用这样的键值迭代:

<%- @listings_cylinder.each do |key, value| -%>
            <h5 style = "color:#F00000; text-align: left;"><strong><%= link_to "#{key.upcase if key} (#{value})" , search_listings_path(params.merge(:cylinder => "#{key}")) %> </strong></h5>
<% end %>

【问题讨论】:

  • 您可能只需要在用户单击或删除构面时使用 javascript。然后从 javascript 导航到 URL
  • @praga2050 任何示例、博客或教程,您都可以指向哪个获取搜索 URL 并向其添加新参数?

标签: javascript jquery ruby-on-rails search faceted-search


【解决方案1】:

不是解决方案,而是一些想法(未经测试):

将所有过滤器以 params 中的散列形式传递给搜索方法(例如 params[:filters])。

定义一个包含所有过滤器的实例变量,并将其加载到控制器的搜索方法中。

根据过滤器过滤列表。

def search
  @current_filters = params[:filters]
  @listings = Listing.all
  @listings = @listings.where(:cylinder => @current_filters[:cylinder]) if @current_filters[:cylinder]
  @listings = @listings.where(:fuel => @current_filters[:fuel]) if @current_filters[:fuel]
  #etc
end

在视图中:

<% @listings_cylinder.each do |key, value| %>
  <h5><%= link_to "#{key.upcase if key} (#{value})", search_listings_path(filters: @current_filters.merge(:cylinder => "#{key}")) %>
  </h5>
<% end %>

在视图中,显示当前过滤器时:

Applied filters: 
<ul>
  <% @current_filters.each do |key, value| %>
    <li><%= link_to value, search_listings_path(filters: @current_filters.except(key)) %>
    </li>
  <% end %>
</ul>

【讨论】:

  • 已经在我的博客文章中提到了同样的问题 :) onceaday.today/subjects/1/posts/66
  • 谢谢索拉夫。我读了你的帖子。好的!您可以在 css 类中设置一些样式,并避免在 html 中使用样式。 :)。不需要为 sm、md 或 lg 重复 col-xs-12(或任何数字)。如果更改列数,则只能使用多个类。
  • 是的......我将重构我的代码并将内联样式移动到 CSS 文件,然后再推动生产。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2017-02-10
  • 1970-01-01
  • 2014-04-14
  • 2014-10-01
  • 2014-07-20
  • 2017-01-17
相关资源
最近更新 更多