2012-11-16 96 views
2

我收到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)

+0

的情況下,我錯誤地輸入控制器線,固定已經 –

回答

5

這不是做你的方法的私有化,但事實證明,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(...)即範圍,你可以調用範圍類的方法。

+0

謝謝,它的作品,只需要瞭解爲什麼:)。所以我從類方法調用的任何方法也必須是類方法? –

+0

如果你不提供一個明確的接收器,是的:'search_order'與'self.search_order'相同,self是類而不是類 –

+0

的實例,謝謝!它解決了我的問題。我不知道這個微妙的規則。 – user1713964

1

search定義爲類方法,因此您應該調用Entry.search(params)而不是@entries.search(params)

+0

這是錯字。固定它已經 –

0

你的方法是一個類方法,你不能用它形成類

相關問題