2015-09-30 53 views
1

我的申請取決於變量page_name,但變量page_name中的值僅在提交表單後設置。如何聲明一個可在整個Rails應用程序中訪問的變量?

我應該使用會話嗎?當我搜索時,我發現如果我的應用程序位於負載均衡器後面,會話將被破壞。

在整個Rails應用程序中創建一個變量是更好的方法嗎?

創建一個常量可以解決我的問題,但只有在用戶填充表單字段中的數據並提交數據之後才能設置變量中的值。所以基本上,用戶有責任填寫我整個應用程序所依賴的變量中的值。

+0

@HarishVed,請再次閱讀問題。我知道一個常數將通過應用程序來訪問。但是在這裏,直到用戶在表單字段中插入一個值並提交它, – Raaz

+0

「變量中的值纔會被設置,直到用戶在表單字段中插入一個值並提交它爲止」問題?在知道用戶要輸入的內容之前,您無法使用它,因此無法調用需要它的代碼。如果它確實嘗試,那麼聽起來像你的代碼有真正的問題。一旦提交,你可以*設置一個全局變量並使用它,但全局變量是主要的代碼氣味,除非你知道爲什麼你應該使用它們。使用數據庫或實例變量。就目前來看,這個問題還沒有很好的界定。 –

回答

5

您需要在數據庫(使用ActiveRecord)或共享的Memcache服務器中持久化該值(假設您可以接受將該變量從緩存中移出時將丟失)。

您只需在您的控制器創建操作中設置數據庫值,就像任何其他模型一樣。

首先,創建模型

rails generate model variable_name variable_value 

要從def create行動保存在它的值:

@app_store = AppStore.find_or_initialize_by_name('variable_name') 
@app_store.variable_value = secure_params[:variable_value] 
@app_store.save 

然後從任何地方檢索您的應用

@app_store = AppStore.find_by_name('variable_name') 
val = @app_store.variable_value 
+0

沒有使用數據庫的方法嗎? – Raaz

+2

如果您需要持久性,即使服務器出現故障,您也需要將該值寫入到負載均衡器後面的所有服務器之間共享的文件系統上的文件中(如果不使用數據庫)。由於這是一款Rails應用程序,我認爲你已經在使用數據庫了。你不是嗎?如果你是,你對使用數據庫進行持久性的關注是什麼?這是它設計的目的。 – Phil

+0

那麼,提交表單後,該值不會存儲在數據庫中。我試圖把它放在一個可以在整個應用程序中訪問的變量中。但看起來像我必須堅持到數據庫。 – Raaz

0

title是一個局部變量。它們只存在於當前塊的範圍內。

@title是一個實例變量,它可用於類中的所有方法。

您可以在「Struggling With Ruby: Variables」中閱讀更多內容。

在Ruby on Rails中,將您的控制器中的變量聲明爲實例變量(如@title)會使它們可用於您的視圖。

+0

是的,我知道,但我想要一個整個應用程序可訪問的變量,而不僅僅是當前的塊或類。 – Raaz

1

會議不會被負載平衡器破壞 - 它取決於您的會話配置AN D您的負載均衡器配置/功能。但通常會話應該與負載平衡器一起正常工作。但會話變量只是可用於..該會話。會話特定的價值,還是真的是跨全球會議?

如果是後者,我只是把它粘在數據庫中。甚至爲GlobalVariables或其他東西創建一個新表,只需要名稱和值。

這是一個「哈克」解決方案,但它可以正常工作,並且很容易做到。

但是,當我重新讀你的問題...沒關係,我不認爲你真的想要做你所問的東西。沒有理由需要創建一個「可通過整個rails應用訪問的變量」來解決這個問題。你也不應該需要會話。我會讓其他人試着回答你沒有問的實際問題。

相關問題