gpt4 book ai didi

ruby-on-rails - 存储在 Rails session 中的对象变成字符串?

转载 作者:行者123 更新时间:2023-12-04 07:22:44 27 4
gpt4 key购买 nike

通常我不会在 Rails session 中存储对象,但我使用的库需要这样做。我遇到了一个非常奇怪的问题,即重定向后存储的对象显示为字符串。

为了重现我创建了一个示例 Rails 4.1 应用程序
$ rails new session-test
添加了一个测试 Controller :

class HomeController < ApplicationController
def index
logger.debug "session[:customer]: #{session[:customer]}"
logger.debug "session[:customer].name: #{session[:customer].name}"
end

def from
Struct.new 'Customer', :name, :address
session[:customer] = Struct::Customer.new 'Dave', '123 Main'
redirect_to :action => :index
end
end

设置路线:
Rails.application.routes.draw do
get 'home/index'
get 'home/from'
root 'home#index'
end

然后我启动 Rails
$ bundle exec rails server
然后在浏览器中点击 localhost:3000/home/from:
Started GET "/home/from" for 127.0.0.1 at 2014-04-09 21:20:25 -0700
Processing by HomeController#from as HTML
Redirected to http://localhost:3000/home/index
Completed 302 Found in 18ms (ActiveRecord: 0.0ms)


Started GET "/home/index" for 127.0.0.1 at 2014-04-09 21:20:25 -0700
Processing by HomeController#index as HTML
session[:customer]: #<struct Struct::Customer name="Dave", address="123 Main">
Completed 500 Internal Server Error in 2ms

NoMethodError (undefined method `name' for "#<struct Struct::Customer name=\"Dave\", address=\"123 Main\">":String):
app/controllers/home_controller.rb:4:in `index'

我不知道为什么这个对象被翻译成一个字符串......

这似乎与 cookie_store 的 session 存储类型有关,因为如果我更改

session_store.rb 来自
Rails.application.config.session_store :cookie_store, key: '_session-test_session'

Rails.application.config.session_store :cache_store
有用!

有任何想法吗?

最佳答案

您不能在 Rails session 中存储对象。它是一个只接受字符串的键值存储,因为通常情况下,它被打包并作为加密的 cookie 发送到客户端。

它不是您可能需要的东西的倾倒场。注意你在那里塞了多少垃圾,因为你越依赖 session ,cookie 越大,客户端将不得不为每个请求返回到你的服务器。

值得观察浏览器网络检查工具中的 header ,以了解您的请求占用的空间有多大。

如果您确实需要在其中保留某些内容,请使用字符串友好的编码格式,例如 JSON,以确保您可以以可用的格式取回数据。

我很犹豫要不要使用 cache_store同样,这不会在您的应用程序的不同实例之间共享。 Ruby 对象仅存在于单个进程的上下文中,因此其他请求(通常会命中某个随机进程)将无法轻松利用它。

默认的 cookie 存储是最可靠的。进程之间共享的其他服务取决于正在运行的其他服务(Memcached、Redis 等),但其中大多数也规定了仅字符串策略。

关于ruby-on-rails - 存储在 Rails session 中的对象变成字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22978704/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com