3

我收到undefined method 'search_type'下面的代码。你能告诉我我在这里做错了什么吗?可能与调用私有函数有关,但我找不到问题所在。

class Entry < ActiveRecord::Base
  attr_accessible :content, :rank, :title, :url, :user_id

  def self.search(params)
    t, o = search_type(params[:type]),search_order(params[:order])
    scope = self

    scope = scope.where(t) if t
    scope.order(o).page(params[:page]).per_page(20)
  end

  private

  def search_order(order)
    return 'comments_count DESC' if order == '1'
    return 'points DESC' if order == '2'

    'rank DESC'
  end

  def search_type(type)
    return nil unless type.present?

    "entry_type = #{type}"
  end
end

在控制器中,我只有@entries = Entry.search(params).

4

3 回答 3

6

这与您的方法的私有性无关,而是因为它search是一个类方法,所以当您search_order从它内部调用时,它正在寻找一个被调用的类方法,search_order但您已经定义search_order为实例方法。

让你的 2 个辅助方法类方法,你应该没问题。如果您希望它们成为私有类方法,那么

class << self
  def search(...)
  end
  private
  def search_type(...)
  end
  def search_order(...)
  end
end

如果您想知道为什么会@entries.search(...)起作用,那是因为我假设@entries 类似于Entry.where(...)即作用域,并且您可以在作用域上调用类方法。

于 2012-11-16T10:16:49.013 回答
1

search被定义为类方法,所以你应该调用Entry.search(params)而不是@entries.search(params).

于 2012-11-16T10:13:56.090 回答
0

你的方法是一个类方法,你不能在你的类的实例中使用它

于 2012-11-16T10:17:14.073 回答