Rails 会话存储模型对象

     2023-03-07     283

关键词:

【中文标题】Rails 会话存储模型对象【英文标题】:Rails session store model object 【发布时间】:2016-07-26 07:22:11 【问题描述】:

我使用 session 来存储我的购物车对象

在我的购物车模型中

def initialize
    @items = Array.new
end

def clean
    @items = Array.new
end 

我想使用 session 来存储整个购物车对象,所以我可以使用上面的方法

喜欢这个

@cart = session[:cart] ||= Cart.new

但我的@cart 输出很奇怪

第一次运行输出

<%= @cart %>
#<Cart:0x007efc844d3af0>

<% @cart.clean %>
true

一切正常,但第二次输出对象的内容

<%= @cart %>
"items"=>[]

<% @cart.clean %>
undefined method `clean'

会话可以存储整个对象吗?

还是我做错了什么?

谢谢。

编辑:

<% session[:cart] = Cart.new %>
<%= session[:cart] %>
#<Cart:0x007efc868be0a0>

<% session[:cart] = session[:cart] ||= Cart.new %>
<%= session[:cart] %>
#<Cart:0x007efc868be0a0> #Because session[:cart] does not exist
<% session[:cart] = session[:cart] ||= Cart.new %>
<%= session[:cart] %>
"items"=>[] #Session does not store the cart object but store the cart object's content

编辑 2:

<% @cart = session[:cart] ||= Cart.new %>
<%= @cart %> #session[:cart] is nil so print Cart.new
<br>
<% session[:cart] = Cart.new %>
<% @cart = session[:cart] ||= Cart.new %>
<%= @cart %> #session[:cart] isn't nil so print session[:cart]

我得到两个输出都是 Cart 对象

当我刷新页面并运行相同的代码时

<% @cart = session[:cart] ||= Cart.new %>

@cart 应该是 session[:cart] 因为 session 不是 nil 并且 session[:cart] 应该是 Cart 对象但它输出 ""items"=>[]"

编辑 3:

第一次:

<%= session[:cart] %>
-> nil
<% session[:cart] = Cart.new %>
<%= session[:cart] %>
-> <Cart:0x00000007c112c0>

第二次:

<%= session[:cart] %>
-> "items"=>[] #Why it isn't a Cart object after I refresh?
<% session[:cart] = Cart.new %>
<%= session[:cart] %>
-> <Cart:0x00000007c112c0>

【问题讨论】:

会话可以存储购物车对象吗?我想让session[:cart].clean@cart.clean 都可以工作,谢谢。 在会话中存储对象不是一个好主意,请参阅***.com/questions/1095714/…。这个线程讨论了它的陷阱。如果您坚持在会话中存储对象,则必须通过将参数传递给 Cart.new(session[:cart]) 或类似的东西来重建它,因为会话会序列化对象并存储它。希望这会有所帮助。 @Shishir 感谢您的帮助,我不想将购物车项目存储到数据库中,所以我将购物车对象放到会话中,购物车对象是一个小数组来存储产品 id 和数量。我不明白为什么我刷新页面我得到不同的会话输出。请参阅编辑 2,谢谢。 第一次渲染,它在服务器端,它们仍然是 ruby​​ 对象。刷新时,会话从客户端获取并反序列化。请参阅此***.com/questions/3804209/… 了解更多信息。 @Shishir 非常感谢!我完全明白。那么如何在没有数据库表的情况下存储 Cart 对象呢? 【参考方案1】:

始终使用购物车对象。从会话初始化它,执行操作,最后将它序列化回会话。

    class Cart
      def initialize(params=)
        @items = params[:items] || []
      end
    end

    controller:
    @cart = Cart.new(session[:cart])
    //do operations on cart

    session[:cart] = @cart

【讨论】:

会话存储在 Rails 中的啥位置?

】会话存储在Rails中的啥位置?【英文标题】:WhereistheSessionStoredinRails?会话存储在Rails中的什么位置?【发布时间】:2015-10-0104:05:43【问题描述】:在Rails中,我为用户身份验证实现了以下代码(确认是正确的)。但是,我想确... 查看详情

rails在会话中存储密码

】rails在会话中存储密码【英文标题】:railsstoringpasswordinasession【发布时间】:2011-11-1709:26:16【问题描述】:我有一个可以进行webapi调用的rails应用程序,rails应用程序本身没有任何数据库或用户存储。每个api调用都需要为每个请... 查看详情

Rails:如何在会话中存储数据?

】Rails:如何在会话中存储数据?【英文标题】:Rails:Howtostoredatainsession?【发布时间】:2014-03-3016:21:45【问题描述】:我正在Rails中制作一个写作考试练习网络应用程序。问题是如果用户的答案被提交到互联网上,他们很容易被ET... 查看详情

在 Rails 中存储持久会话数据而不影响正常会话过期

】在Rails中存储持久会话数据而不影响正常会话过期【英文标题】:StoringpersistentsessiondatainRailswithoutaffectingnormalsessionexpiration【发布时间】:2010-02-1404:37:13【问题描述】:我想为每个浏览器(用户设置)存储一些持久数据,并且... 查看详情

Rails 最好的安全会话存储?

】Rails最好的安全会话存储?【英文标题】:Railsbestsessionstorageforsecurity?【发布时间】:2014-06-1417:21:12【问题描述】:我正在尝试设置我的会话以在服务器上运行,但不知道如何去做。我已经搜索了一段时间,但找不到可以帮助... 查看详情

在 Rails api 应用程序中存储会话

】在Railsapi应用程序中存储会话【英文标题】:storingsessioninrailsapiapplication【发布时间】:2016-06-1612:23:15【问题描述】:我有一个仅限Railsapi的应用程序[config.api_only=true],我在其中通过以下几行启用cookie:在application.rb中:config.mi... 查看详情

Ruby on Rails 中的会话如何工作?

】RubyonRails中的会话如何工作?【英文标题】:HowdosessionsworkinRubyonRails?【发布时间】:2015-08-2320:03:55【问题描述】:我想知道会话在RubyonRails中是如何工作的。我现在可以使用session[:user_id]=@user.id保存会话并使用session[:user_id]检索... 查看详情

Rails ActiveRecord 会话存储在 HTML5 SessionStorage 中而不是 Cookie

】RailsActiveRecord会话存储在HTML5SessionStorage中而不是Cookie【英文标题】:RailsActiveRecordSessionStoreinHTML5SessionStorageInsteadofCookie【发布时间】:2013-08-2110:10:43【问题描述】:我的应用程序要求用户在浏览器的不同选项卡中登录不同的帐... 查看详情

销毁管理会话导致 http 获取请求 rails 4

】销毁管理会话导致http获取请求rails4【英文标题】:destroyadminsessionresultinginhttpgetrequestrails4【发布时间】:2015-02-0117:13:29【问题描述】:我的Rails4应用程序有一个用户和管理员模型。我已经为通过rails_admingem创建的Admin模型实现... 查看详情

Rails:回溯对象所属的模型

】Rails:回溯对象所属的模型【英文标题】:Rails:Referringbacktomodeltheobjectbelongsto【发布时间】:2011-01-0203:00:05【问题描述】:这可能是一个愚蠢的问题,但我似乎找不到一个好的答案。我想知道引用对象所属模型的最佳方法。例... 查看详情

Rails、Cucumber、Capybara:会话不持久

】Rails、Cucumber、Capybara:会话不持久【英文标题】:Rails,Cucumber,Capybara:sessionisnotpersisted【发布时间】:2011-07-0521:48:20【问题描述】:我正在尝试为依赖于某些会话存储数据的功能编写测试,我的场景如下所示:Scenario:CreateofferGive... 查看详情

在 Rails 和 Spring MVC 之间共享会话

】在Rails和SpringMVC之间共享会话【英文标题】:SharingthesessionbetweenRailsandSpringMVC【发布时间】:2012-03-2718:13:38【问题描述】:在Rails中,会话存储在cookie中并签名以防止伪造。我正在寻找有关以某种方式让SpringMVC加载Railscookie(以... 查看详情

Rails 没有在 ajax 帖子上重新加载会话

】Rails没有在ajax帖子上重新加载会话【英文标题】:Railsnotreloadingsessiononajaxpost【发布时间】:2011-07-0420:18:05【问题描述】:我在使用jQuery的Rails和ajax方面遇到了一个非常奇怪的问题(尽管我认为这不是jQuery特有的)。我的Rails应... 查看详情

会话和 cookie 在 Rails 中是如何工作的?

】会话和cookie在Rails中是如何工作的?【英文标题】:HowdosessionsandcookiesworkinRails?【发布时间】:2015-05-2419:54:39【问题描述】:我一直在使用Devise处理我的Rails应用程序的身份验证,但从未真正了解它是如何工作的。因为Devise还使... 查看详情

在 Rails 中创建对象及其所有关联模型的副本

】在Rails中创建对象及其所有关联模型的副本【英文标题】:Createacopyofanobjectandallitsassociatedmodelsinrails【发布时间】:2013-07-2319:33:21【问题描述】:我正在努力在rails及其所有相关的关联模型中创建对象的副本。但我无法找到解决... 查看详情

如何在 Rails 中缓存模型对象?

】如何在Rails中缓存模型对象?【英文标题】:HowcanIcacheModelobjectsinRails?【发布时间】:2011-04-2102:26:55【问题描述】:有没有一种我可以在Rails中使用的技术,这样每当对Model对象执行简单的“查找”时,首先在memcached中搜索结果... 查看详情

Rails 查询/范围:根据连接模型的属性排除对象

】Rails查询/范围:根据连接模型的属性排除对象【英文标题】:Railsquery/scope:excludeobjectsaccordingtoattributeofjoinedmodel【发布时间】:2012-01-1513:58:01【问题描述】:我的模型如下所示:classTicket<ActiveRecord::Basehas_and_belongs_to_many:tagsendc... 查看详情

Grails:在用户会话期间存储数据的最佳方法[关闭]

】Grails:在用户会话期间存储数据的最佳方法[关闭]【英文标题】:Grails:Bestapproachforstoringdataforthedurationoftheuserssession[closed]【发布时间】:2014-01-2504:27:31【问题描述】:以下哪种方法被认为是在用户会话期间将数据存储在grails中... 查看详情