2010-01-10 76 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