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がスコープのようなものであり、スコープでクラスメソッドを呼び出すことができると@entries.search(...)仮定しているためです。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 に答える