2011-09-17 75 views
4

問題1:

Rails操作(方法)中實例變量的作用域是什麼。與服務器的每個連接是否構成控制器的新實例?Ruby實例和與Rails相關的全局變量

例如:

  • USER_A加載'設定器頁面,引起稱爲@randInt隨機實例變量產生。
  • User_B(來自別處的另一臺PC)載入'getter'頁面,請求@randInt

User_B將檢索由User_A設置的@randInt?或者是User_A連接唯一的實例變量?

問題2:

問題2是相同的問題1,但使用代替@@randInt。如果問題2的答案是「是的,兩個用戶都可以看到這個值」,那麼在Rails中使用全局變量來存儲想要在多個用戶間共享的臨時數據是可以接受的做法嗎?

在先進的感謝,

德里克

回答

2

問題1:沒有,實例變量只共享在實例,在「實例」指的是控制器的實例,所以這些變量只是最後一個請求(因此User_B將收到不同的@randInt)。

問題2:@@變量不是全局變量,$ variables are@@是類變量。正如鏈接所解釋的,不同的機器實例(例如,如果您使用FCGI)將不會共享變量,因此請勿使用它們。

如果您需要全局常量,請將它們設置爲config。全局變量可能更好留在數據庫中(我可以看到它們的用途,比如站點設置,但這些用法似乎最適合用於數據庫)。

您可以使用類變量作爲persistant instance variables,但是您可能會更好地使用數據庫來存儲此類值,因爲無法保證您的類不會被重新加載(因此會重置任何類變量)。

+0

非常感謝,謝謝。這真的爲我清除它! – Derek

+1

我可能不會使用術語* session *,因爲它會引起與實際導軌會話的混淆。實際上,每個請求都會創建一個新的控制器實例,其中實例變量在請求期間有效。 –

+0

我認爲它,但應該更難以考慮。你是完全正確的,更新了答案,以消除任何困惑(希望)。 – Alex