2011-04-23 25 views
0

我是新來的RoR和建立一個新的控制器,我嘗試從控制器的初始化方法中的params散列獲得:id,但是導軌回來說它是一種方法。到處都是我讀過的,所以爲什麼NoMethod錯誤?初始化方法中的參數散列

無論如何,讓我難以理解的主要原因是爲什麼我無法從初始化方法訪問參數散列(或方法或任何它:) :)?

真的很感激任何幫助......

謝謝:)

class PeopleController < ApplicationController 

    def initialize 
    if params[:id] && !params[:id].empty 
     @person = Person.find(params[:id]) 
    end 
    end 

    def index 
    @people = Person.all 
    end 

    def show 
    @person = Person.find(params[:id]) 
    end 

和錯誤的截圖是在這裏:http://img820.imageshack.us/img820/6063/screenshot20110423at221.png

感謝

回答

0

因爲初始化在創建類時調用。在這一點上,我想這個請求還沒有被處理。如果你第一次調用super,它可能會更好,但我不認爲Rails應用程序通常使用類初始值設定項。

+0

好,但PARAMS哈希或方法?它是什麼? – Ryan 2011-04-23 21:26:25

+0

哦,什麼是'超級'? – Ryan 2011-04-23 21:33:13

+0

** 1。**它像哈希一樣。 Ruby接口是故意模糊的,在某種抽象層次上,所有事情都只是響應消息。一些消息是內置的。 ** 2。**'super'是父類或*超類*中的* initialize *方法。通過定義一個* initialize *,你可以攔截在超類中初始化的調用,但是從初始化方法調用* super *會調用父類。 – DigitalRoss 2011-04-23 21:49:31

0

嘗試使用before_filter,可能更符合您的要求。


舉例我的評論

def foo 
    {:hello => "world", :foo => "bar"} 
end 

foo[:hello] # => "world" 
foo[:foo] # => "bar" 
+0

是的,我已經看到了before_filter,但我不明白爲什麼params不在初始化,因爲它是在路由中定義的? – Ryan 2011-04-23 21:27:19

+0

好吧,初始化和請求發生時是有區別的。在發出請求之前,控制器將被加載並初始化。爲了獲得參數,您需要首先提出實際要求。 – nowk 2011-04-23 21:30:36

+0

好的,但它是一個散列或方法? – Ryan 2011-04-23 21:32:11

1

使用before_filter得到你正在尋找的結果是:

class PeopleController < ApplicationController 

    before_filter :find_person 

    def index 
    @people = Person.all 
    end 

    def show 
    # @person is already set from the before_filter 
    # @person = Person.find(params[:id]) 
    end 

    private 

    def find_person 
    if params[:id] && !params[:id].blank? 
     @person = Person.find(params[:id]) 
    end 
    end 
+0

謝謝你的感謝... – Ryan 2011-04-23 21:32:25

+0

你認爲這樣做更好還是'inherited_resources'寶石? – Ryan 2011-04-23 21:37:46

+0

'inherited_resources' gem做了類似的事情,我之前已經使用它,但最終我最終會隨着時間的推移重新實現該功能的更多特定於應用程序的版本。所以我會說'inherited_resources'是開發和原型開發的一個很好的開始。 – ctcherry 2011-04-23 21:58:41