2013-12-18 54 views
0

在我的控制器的索引操作中,我設置了image = AppImage.new(:path => (Rails.root.to_s + "/highlands_girl.jpg"))。然後我設置$image = imageRails全局變量在控制器動作間變爲零

然後我有其他控制器操作,我再次調用這個全局變量,有時它是零,圖像不顯示,但有時它會。我可以從我的日誌文件中的調試打印中知道,對全局變量的所有調用都是在它被設置之後進行的,所以在我再次調用image之前發生了$image=image,並且發現它爲零。特別是,我有一個視圖調用五次的縮略圖動作。在一些負載中,所有五個呼叫都會給出一個圖像,而在一些情況下,則沒有。

如果它很重要,當我在Heroku上進行託管時,這並不是問題,但是由於我將它移動到了AWS,所以它有這個問題。如果可能的話,我想避免將它寫入數據庫,這就是爲什麼我使用new而不是create。

+2

全局變量?真? – apneadiving

+0

在Rails中使用應用程序級別的變量是一種非常危險的做法,我看到你已經在路上困住了這個bug。重構代碼以避免應用程序級別的變量是個好主意。 –

+0

哈哈我認爲這可能是一個壞主意,猜測是這樣。有沒有將其保存到數據庫的替代方法? – mlstudent

回答

1

你不應該在rails中使用全局變量(坦率地說,在其他任何地方) - 存儲數據的地方要好得多。如果您的應用程序圖像是一個模型,就足夠了它的ID存儲在會話中,寫setter和應用程序控制器的getter:

#ApplicationController 

def image=(image) 
    session[:image_id] = (@image = image).try(:id) 
end 

def image 
    @image ||= AppImage.find(session[:image_id]]) 
end 

如果它不是一個模式,它應該足以故事圖像路徑:

def image=(image) 
    session[:image_path] = (@image = image).try(:path) 
end 

def image 
    @image ||= AppImage.new(path: session[:image_path]]) 
end 
+0

謝謝,我會嘗試一下,一旦我得到它的工作將接受它。 – mlstudent

+0

一個問題:這不需要我將它添加到數據庫中,對吧? – mlstudent

+0

那麼,關鍵問題是 - 你的AppImage是不是一個模型?如果不是,則將圖像路徑存儲在會話中。即使它是一個會話,只有保存模型時id纔是非零,因此存儲在數據庫中,所以路徑方法可能會更好。我會更新答案 – BroiSatse