Rails搜索和类别下拉(无方法错误)

时间:2012-12-11 04:23:01

标签: ruby-on-rails ruby

我的events控制器中有以下内容:

def index
  @event = Event.search(params[:search]).events_by_category(params[:cat]).order(...).paginate(...)
end

在我的events模型中,我有以下类方法:

def self.events_by_category(cat)
  if cat == 0
    all
  elsif cat && cat != 0
    where('category = ?', cat)
  else
    scoped
  end
end

在我看来,我有一个标准搜索框,用于搜索和下拉类别选择。类别options_for_select包含一个包含["All Categories", 0]的数组。

我的问题是:为什么在下拉列表中选择所有类别时,这不会返回结果而不是所有结果。并且,当我将数组更改为["All Categories", "ALL"]并将if语句更改为if cat == "ALL"时,它会返回Undefined method 'order'

我认为它与在控制器中将搜索和events_by_category串在一起有所作为,但搜索和类别在没有选择所有类别的情况下可以正常工作...

任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:2)

首先回答您的第二个问题:问题是您的cat == "ALL"条件会返回Event.all,这是一个Ruby Array,而不是ActiveRecord::Relationorder是一种activerecord方法,而不是数组方法,这就是为什么你收到错误Undefined method 'order'

如果要返回类别ALL的所有结果,请将all更改为scoped(这将返回没有条件的范围)。这将是可链接的,因此您可以使用orderpaginate来调用它。

关于您的第一个问题,params[:cat]是一个字符串,因此您应该检查cat == "0"是否cat == 0。我认为应该解决问题。

顺便提一下,你的条件有点复杂:你正在测试cat是否为0,然后在else语句中检查它是否为0,但你已经知道它不是0。我建议将方法代码简化为:

def self.events_by_category(cat)
  (cat && cat != "0") ? where('category = ?', cat) : scoped
end

这表示:如果类别存在而不是"0"(即不是“所有结果”类别),则返回该类别的结果,如果不返回所有结果。

答案 1 :(得分:0)

def self.events_by_category(cat)
 if cat == "0"
   all
 elsif cat && cat != "0"
   where('category = ?', cat)
 else
   scoped
 end
end


以上将有效。