Ruby on Rails - link_to with tag filter

时间:2016-01-12 17:13:37

标签: ruby-on-rails

On Rails 4.我正在制作一个包含产品的网站。这些产品可以有很多标签。机型:

class Product < ActiveRecord::Base
  has_many :tags, through: :product_tags

class Tag < ActiveRecord::Base
  has_many :products, through: :product_tags

我正在尝试创建一个应用程序范围的导航栏,用户可以单击每个导航链接将他/她带到产品索引,然后根据链接中的标记名称过滤产品。到目前为止,我实际上有这个工作:

application.html.erb

<li><%= link_to "Pencils", products_path(tag: "Pencils") %></li>


products_controller.rb

def index
    if params[:tag]
      @products = Product.joins(:tags).order('id').page(params[:page]).per(20).where(tags: { name: params[:tag] })
    else
      @products = @q.result(distinct: true).order('id').page(params[:page]).per(20)
    end

  end

(“else”部分使用Ransack,如果您不想使用导航链接,标题内还有一个表单可输入搜索词。)

我的麻烦来自我想要退回我想过滤的有两个标签的产品。例如,假设我有“蓝色”和“铅笔”标签,我想制作找到所有Blue Pencil产品的link_to。我尝试了一些方法,包括尝试使用.split()但无法得到我需要的结果。如果有其他方式,不要在这里使用宝石。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

你可以传递两个标签......

<li><%= link_to "Blue Pencils", products_path(tag: "Pencils", tag2: "Blue") %></li>

...然后你应该能够使用多个where条款...

def index#
  if params[:tag2]
    @products = Product.joins(:tags).order('id').page(params[:page]).per(20).where(tags: { name: params[:tag] }).where(tags: { name: params[:tag2] })
  elsif params[:tag]
    @products = Product.joins(:tags).order('id').page(params[:page]).per(20).where(tags: { name: params[:tag] })
  else
    @products = @q.result(distinct: true).order('id').page(params[:page]).per(20)
  end
end