我陷入两难境地。
我的网络应用程序处理人物,地点,资产(例如图像),标签等主题,我在其routes.rb中使用由map.resources生成的RESTful路由。
访问者可以设置各种查看此数据的选项,例如排序顺序,选择资产类型,所有者或关联的标记以及视图类型。这些选项是粘性的,因此如果访问者导航,那么当他们返回资产视图时,相同的选项将生效。
为此,我使用map.resource创建了一个SessionController和相关的restful路由。 update方法接受asset_type,view_type和owner_id等参数,并将它们存储在会话对象中。然后,AssetController #index使用这些值来选择要显示的数据和正确的视图。
我遇到的问题是,我还需要能够发布“http://www.foo.com/assets?user_id=10&tag_id=185&type=video&sort=recent”等网址,以便通过电子邮件等方式发送。
查询参数会覆盖当前会话中存储的所有设置。它们也需要粘性,否则“导航并回到同一位置”的原则就会被打破。这意味着AssetController #index必须将任何查询参数与当前会话设置合并,并将组合结果存储回会话中。
所以我现在有2种做同样事情的方法,这看起来不太干。
我不喜欢具有这种精神分裂症质量的会话,但它确实简化了能够使用表格来选择排序顺序和设置复杂的过滤选项等的事情。
将会话视为要发布的资源我是错误的吗? 我很感激你能给我的任何指导。
答案 0 :(得分:2)
从理论上讲,你是对的。 REST具有由Fielding(REST的“发明者”)解释here的无状态约束。事实上,如果你想坚持他的REST提议,你根本就没有“粘性”选项。这意味着参数必须在每个请求中传递而不是从会话对象中检索,这样您就可以在描述的两种情况下采用一致的方法。
答案 1 :(得分:0)
我能看到的另一种无状态的方法是为这些映射位置生成一个密钥,并将它们存储在服务器端的某个持久存储中。当前用户可能是一行,然后如果他们要转到代表其他位置的不同URL,那么您可以合并数据库中的两行,然后创建一个新密钥并将它们发送到该URL(我是否有意义) ?)。无状态方面只是意味着您无法存储客户端(如cookie /会话) - 这并不意味着客户端操作无法为将来的请求更改服务器状态。