【问题标题】:Rails Search and Category Dropdown (No Method Error)Rails 搜索和类别下拉列表(无方法错误)
【发布时间】:2012-12-11 04:23:01
【问题描述】:

我的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 串在一起有关,但是当没有选择所有类别时,搜索和类别可以很好地结合使用...

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    首先回答您的第二个问题:问题是您的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。我d 建议将您的方法代码简化为:

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

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

    【讨论】:

    • 感谢清晰的解释!我在第二个 else 中使用了作用域,由于某种原因,当我使用 all 时没有单击。而且,也感谢您重构代码!
    【解决方案2】:
    def self.events_by_category(cat)
     if cat == "0"
       all
     elsif cat && cat != "0"
       where('category = ?', cat)
     else
       scoped
     end
    end
    


    以上方法都可以。

    【讨论】:

    • 不,这不起作用,原因我在下面描述:all 返回一个数组,所以当用order 调用它时会引发错误。
    猜你喜欢
    • 2021-05-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多