2011-11-03 80 views
2

我正在实现一种红宝石在线终端(仅供练习)。我正在使用AJAX从一个简单的js web应用程序调用一个方法,以避免“终端”的输入。为了避免环境问题并让用户创建自己的对象,我使用了“绑定”对象。问题是我不知道如何坚持绑定。如何在Rails中保留对象

我的第一个想法是创建一个bindindg,它在用户每次访问应用程序时在帖子请求之间持续存在。在那一刻,一个关键 - 对象对用一个唯一的键和一个新的绑定来创建。密钥然后传递给客户端。当用户通过ajax发送字符串来评估时,我发送密钥。然后,我可以获取绑定对象并更新它。

我想是这样的:

class TerminalController 
    @@bindings = {} 

    def index 
     @token = keyToken 
     @@bindings[@token] = getBinding 
    end 

    private 

     def keyToken 
      Digest::MD5.hexdigest(Time.now.to_s) 
     end 

     def getBinding 
      # declare methods for all bindings 
      # ... 
      binding 
     end 
end 

但在执行时,代码失败创建键值对。事实上,任何我尝试在该行后执行失败。我不明白为什么。

其实,我认为如果我可以序列化绑定它会工作,但我认为它可能是低效的,因为网络延迟和绑定的可能增长。

回答

0

不幸的是我不认为有一种方法可以在大多数Ruby实现中序列化绑定。如果你尝试Marshal.dump绑定,你会在MRI中出现TypeError(Marshal是用于在Ruby中序列化对象的内置库)。

可能有更多的其他方式来做你想做的事情。但是,如果您必须序列化绑定,请查看MagLev。该实现的设计使得任何对象都可以被持久化。

+0

我实际上试图在Rubinius做这项工作。 Marshal.dump似乎可行,但序列化的字符串不包含有关任何变量或方法的信息,所以它没用。我会尝试MagLev,我希望它能起作用。谢谢。我其实希望有一个红宝石在线repl。 –

+1

另一种方法可能是使用websockets,它可以保持与服务器的连接。当你完成你的repl会话时,你关闭连接,就是这样。我曾经听说过这样的一次......这可能是它,但我从来没有尝试过它自己:https://github.com/cldwalker/nirvana –

+0

它很好用!谢谢。 –