我有很多数据需要通过多步骤表单来保存。我不想在隐藏的html元素中加载元素,因为它会使页面无响应。我不需要在请求之间向用户显示所有数据。数据也可能超出cookie限制。
我已就此主题进行了研究。我读了这个post。从本质上讲,它表明:
Rails进程通过加载框架来开始其生命周期 应用。它们通常只运行一个线程 在其生命周期内处理许多请求。因此,请求将是 严格按顺序发送。
这对我来说很准确。我正在使用Nginx的免费版Phusion Passenger。因此,没有多线程。
然后声明:
尽管如此,所有类都会在请求中持续存在。这意味着任何 从您的类引用的对象将在请求之间共享。
所以我认为我可以这样做:
# user.rb
class User < ActiveRecord::Base
attr_accessor :large_amount_of_data
end
# users_controller.rb
def update
User.large_amount_of_data = User.parse_csv(params[:alot_of_data])
end
然后在表单的最后一步,我可以使用User.large_amount_of_data
现在我知道Passenger会产生多个Rails进程以抵消其单线程性质。正如帖子所说:
在等待慢速时阻止所有请求根本不是很酷 数据库查询,所以简单的方法是产生更多的进程。 当然,这些过程不共享任何东西(除了一些记忆 也许,你不会注意到的)。 如果你保存东西,这可能会咬你 在请求期间的类变量或类实例变量中。 然后,不知何故,有时东西似乎存在,并且 有时它似乎消失了。(实际上,当然,数据可能会 或者可能不存在于某个过程中,而在其他过程中则不存在。)
和
每次请求后都会丢弃所有控制器实例,但正如我们所说 知道,这些课程是共享的。如果你通过,这可能会咬你 类变量或类实例变量中的信息。 如果您没有正确使用同步方法,您可能会很好 最终陷入竞争状态地狱。
因此,如果请求A中的用户正在使用多步形式,并且我将数据存储在类方法中,并且生成另一个Passenger进程,请求B,则类方法中的数据可能会因Request而消失一个?请求A中填充的数据是否在请求B中可用(在不同的进程上运行)?鉴于我的Phusion Passenger / Rails 4 / Nginx堆栈,假设这类数据的完整性是否安全?或者有更好的解决方案吗?