2015-06-14 666 views
1

如何讀取類變量?在我的情況下,我無法從變量中獲得價值。訪問類實例變量

class MediaContentsController < ApplicationController 

    @randomUsrId = rand(100) 

    def create   
    puts @randomUsrId 
    end 

end 
+0

爲什麼你想要一個控制器中的類變量?你到底想要做什麼? – Surya

+0

這不是類變量。它實際上是類範圍中的實例變量。 –

回答

1

首先,@randomUsrId指實例變量,而不是一個類變量。你可以通過類的實例訪問它,而不是直接在類上。對於類變量,您應該使用@@randomUsrId

實際上您正在尋找的是attr_accessor :randomUsrId,通過這個,您可以在實例方法上閱讀它,甚至可以通過類的實例進行設置。

方法如下:

class MediaContentsController < ApplicationController 
    attr_accessor :randomUsrId 

    @randomUsrId = rand(100) 

    def create 
    puts @randomUsrId 
    end 
end 

@randomUsrId = rand(100)不會將@randomUsrId隨機數,至少它是不推薦的方式。你應該在這裏使用before_action

class MediaContentsController < ApplicationController 
    attr_accessor :randomUsrId 
    before_action :set_user_id_to_a_random_number, only: :create 

    def create 
    puts @randomUsrId 
    end 

    private 
    def set_user_id_to_a_random_number 
    @randomUsrId = rand(100) 
    end 
end 

編輯:

每次調用set_user_id_to_a_random_number功能時,它會基於rand(100)不同的號碼,它裏面存儲@randomUsrId。如果這是你不想要的東西,你要堅持相同的值,你可以這樣做以下:

def set_user_id_to_a_random_number 
    @randomUsrId = rand(100) unless defined? @randomUsrId 
end 

編輯

我只爲一個請求規定的作品,如果你有多個請求,它不會工作。作爲瑞安貝茨說:here

一個實例變量只有堅持圍繞單個請求,所以使用上述只會有利於你的技術,如果你需要多次調用的方法每個請求。

如果您想要在多個請求之間存儲某些內容,那麼會留下兩個選項。您可以使用數據庫,也可以使用名爲memcached的東西。

+0

我有MediaContentsController未定義的局部變量或方法'set_user_id_to_a_random_number':類 – Dominik

+0

對不起,它應該是一個符號,應該像':set_user_id_to_a_random_number',我編輯了我的答案。請看一看! –

+0

謝謝,它的工作 – Dominik

0

你可能做錯事在你的代碼,因爲這是不如何Rails的控制器邏輯應經常執行,但讓我們坐下來你的問題呢。正如我前面提到它是不是類變量,它在類範圍的實例變量,所以爲了訪問它,你應該首先從範圍得到它:

class MediaContentsController 

    @randomUsrId = rand(100) 

    def create 
    puts self.class.get_random_usr_id 
    end 

    def self.get_random_usr_id 
    @randomUsrId 
    end 
end 


MediaContentsController.new.create 
# => 44 
+0

何時以及如何運行'@randomUsrId = rand(100)',以及在什麼情況下運行? –

+0

@ArslanAli _when和how?在解釋過程中,與任何其他代碼指令一樣。 _在類上下文中的什麼上下文(這就是爲什麼這個變量可以被任何類方法訪問)。您可以將此代碼複製粘貼到您的計算機並多次運行。 –

+0

明白了,謝謝! –