【发布时间】:2011-09-27 13:48:34
【问题描述】:
我有一个应用程序,它具有不同的数据集,具体取决于用户当前选择的公司(侧边栏上的下拉框当前用于设置会话变量)。
我的客户表示希望能够在单个浏览器中同时处理多个不同的数据集。因此,会话不再削减它。
谷歌搜索似乎意味着获取或发布数据以及每个请求都是这种方式,这是我的第一个猜测。有没有更好/更容易/rails 的方法来实现这一点?
【问题讨论】:
标签: ruby-on-rails session post tabs get
我有一个应用程序,它具有不同的数据集,具体取决于用户当前选择的公司(侧边栏上的下拉框当前用于设置会话变量)。
我的客户表示希望能够在单个浏览器中同时处理多个不同的数据集。因此,会话不再削减它。
谷歌搜索似乎意味着获取或发布数据以及每个请求都是这种方式,这是我的第一个猜测。有没有更好/更容易/rails 的方法来实现这一点?
【问题讨论】:
标签: ruby-on-rails session post tabs get
您在这里有几个选择,但正如您所指出的,session 系统不适用于您,因为它在同一浏览器的所有实例中都是全局的。
标准方法是在 URL 中添加一些内容来标识要执行的上下文。这可以像/companyx/users 这样的前缀而不是/users 一样简单,您可以在其中获取公司信息并将其用作范围。通常,您需要一个控制器基类来为您工作,然后从该基类继承所有其他将受到相同影响的控制器。
另一种方法是将公司标识组件从 URL 移动到主机名。这在软件即服务提供商中很常见,因为它使您的应用程序分片变得更加容易。而不是myapp.com/companyx/users,您将拥有companyx.myapp.com/users。这样做的好处是可以保留现有的 URL 结构,并且当您拥有大量数据时,您可以将您的应用按客户划分到不同的数据库中,而不会让人头疼。
您通过使用 GET 令牌或 POST 字段标记所有 URL 找到的答案不会很好地工作。一方面,它很乱,其次,每个链接都是 POST 的网站使用起来非常烦人,因为它使使用后退按钮导航或强制重新加载很麻烦。之所以看到使用,是因为开箱即用的 PHP 和 ASP 不支持路由,所以只能勉强凑合。
【讨论】:
您可以创建一个临时数据库表,或者使用一个键值数据库并将您需要的所有数据存储在其中。 uniq 键可用作窗口 ID。此外,您必须将此窗口 ID 添加到每个链接。这样就可以从数据库中接收到每个浏览器标签对应的数据,并将其存储在会话、对象、...
如果您有一个对象,比如说@data,您可以使用 Marshal.dump 将其存储在数据库中,然后使用 Marshal.load 将其取回。
【讨论】: