2010-01-10 51 views
2

這可能是一個新手問題,但我不確定搜索什麼條款。如何跨重定向緩存ActiveRecord模型對象?

假設我有一個CUSTOMER對象,並且我想向該客戶發送MESSAGE消息。

我會先做的是在CUSTOMER控制器上添加一個SENDMESSAGE動作,該動作構建消息對象。 (假設這是正確的做法?)

但是在這個例子中,我不需要從這個動作中實際發送消息,我需要轉發到MESSAGE的編輯視圖以捕獲正文文本等。

問題:我想這樣做,而不堅持對象。我想在這裏構建對象,然後將其交給另一個視圖來完成。

def sendmessage 
    @message = Message.new 
    @message.title = 'WIBBLE' 
    @message.thecustomer = self 
    @message.save  
    respond_to do |format| 
     format.html { redirect_to(edit_message_path(@ message)) } 
     format.xml { render :xml => @ message } 
    end 
end 

也許我的問題歸結爲,什麼是「軌方式」緩存參數和對象的不同請求和多個屏幕。

很高興指向Web網址,因爲我期望這很簡單。

感謝

回答

1

的標準方法堅持跨請求數據時,構建Web應用程序是使用HTTP會話。 Rails使隱式會話哈希可用於此目的。它這樣使用:

session[:message] = @message #store 
@message = session[:message] #retrieve 

您還可以使用Rails的flash會議包裝從當前操作到下一個傳遞信息。它通常用於存儲顯示在用戶界面的文字,但你可以用它來堅持任何對象:

flash[:message] = @message #store 
@message = flash[:message] #retrieve 

在這兩種情況下,你要存儲的對象必須是可序列化。請注意,默認情況下,Rails將會話數據存儲在客戶端的加密cookie中;認爲這是一個強烈的暗示,在會話中存儲大量數據在Rails世界中被忽視了。

+0

非常感謝約翰。Cookie中的會話內容聽起來像是一個奇怪的設計決定! – 2010-01-10 18:43:59

+0

我還可以問,你會使用會話緩存控制器的動作嗎?例如我的INDEX操作根據傳入參數執行一個時髦的查詢。我想緩存該特定結果列表,以便隨後調用SENDMESSAGE。 (這可能意味着成千上萬的對象存儲在會話cookie中,因此猜測不)。但是,在調用SENDMESSAGE時,我沒有再次重建CUSTOMER列表所需的所有參數?也許緩存這些參數? (很多方法可以做到這一點,但尋找rails的方式! – 2010-01-10 19:01:48

+0

這聽起來像緩存參數,所以你可以重建查詢將是要走的路。注意,我說cookie會話存儲是Rails的默認值。 'environment.rb'中的config.action_controller.session_store'選項允許您使用數據庫來存儲會話存儲。 – 2010-01-10 19:25:12

1

這實際上是一個很複雜的常見任務。 Rails處理這個問題的方法不是堅持這個對象,而是渲染完成該行爲的視圖。

class CustomersController < Application Controller 
    def sendmessage 
    @message = Message.new 
    @message.title = 'WIBBLE' 
    @message.thecustomer = self 
    respond_to do |format| 
     format.html { render "messages/edit" } 
     format.xml { render :xml => @ message } 
    end 
    end 
end 

一般Rails中堅持通過HTTP請求整個對象是一個壞主意,唯一真正的方法來做到這一點是要通過會議或閃存哈希約翰·託普利建議,但是這兩個都是有限在可用空間的數量。這就是爲什麼FrançoisBeausoleil建議只在會話中存儲對象ID的原因。無論哪種方式,你應該清除哈希當你完成它。

你應該在這裏做什麼,設計你的控制器動作,使每個動作完全完成一項任務。完成一半的任務並重定向,所以第二個動作可以完成任務可能稍微更幹,但是,它不能很好地融入Rails控制流程。如示例所示,控制器操作完成呈現視圖所需的所有處理。

基本上,如果你想保存信息,因爲你重定向。你會發現渲染你重定向到的視圖更容易。

+0

你說得對,如果可能,渲染比重定向要好,並不總是可能的;請參閱http://stackoverflow.com/questions/5175385/where-to-render-comments-controller-in-rails-on-model-validations-failure/8706403#8706403 – 2012-01-03 00:34:41