【发布时间】:2020-11-13 01:45:39
【问题描述】:
我正在使用 Rails 6、Devise 和 Redis 进行缓存。 如果我跑
redis-cli 监视器
我看到 Rails 尝试获取密钥并刷新缓存。即使我只是重新加载同一页面或在同一用户登录会话期间更改网页。也许是因为用户模型上的 utm 和 referrer 字段? utm/referrer 在用户注册时填写,它们永远不会改变。
这是一个问题,因为当我只需要“get”时,我执行了“get”/“set”操作。
1604411976.019840 [0 [::1]:50683] "get" "_session_id:2::252360dc050fb8d65e84a43a7a55da72ce1428fbdde4d9cda696296e3bdb130d"
1604411978.440996 [0 [::1]:50683] "设置" "_session_id:2::252360dc050fb8d65e84a43a7a55da72ce1428fbdde4d9cda696296e3bdb130d" "\x04\bo: ActiveSupport::Cache::Entry\t:\x0b@value{\nI"\x0fsession_id\x06:\x06ETI"%45f803f32b1a89b8d6b0fc38ff90b00c\x06;\aTI"\x19warden.user.user.key\x06 ;\aT[\a[\x06i\x06I""$2a$11$6p01wAYCqmAGsjxzT40z8O\x06;\aTI"\butm\x06;\aT{\n:\x0bsource0:\rcampaign0:\x0bmedium0:\x0ccontent0:\tterm0I" \x10_csrf_token\x06;\aTI"1SzDbADoyFrsa/DwWutlecf+7RiSURygsxiU5+XL/o5c=\x06;\aTI"\rreferrer\x06;\aT"Ehttp://localhost:3000/en/profiles/34/items/35940: \r@version0:\x10@created_atf\x161604411978.440767:\x10@expires_in0
配置/设计
config.skip_session_storage = [:http_auth]
app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:trackable
Schema.yml
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "locale"
t.integer "sign_in_count"
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.string "stripe_id"
t.string "paypal"
t.decimal "referral_commission"
t.date "trial_end_date"
t.string "coupon_code"
t.json "utm"
t.string "referrer"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
config/application.rb
config.middleware.insert_after ActionDispatch::Static, Rack::Deflater
config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies # Required for all session management
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options
问题不是由控制器引起的。没有代码。 app/controller/application_controller.rb
class ApplicationController < ActionController::Base
# It happens even when I remove everything from here and page controller
end
class PagesController < ApplicationController
def test
render json: "ok"
end
end
【问题讨论】:
-
我很惊讶到目前为止没有人在这里回答:从我的角度来看,几乎不可能帮助你解决这个问题,除非你也分享至少一点代码(可能在控制器中,因为这是您处理会话的地方,对吗?)您与缓存存储交互的地方。
-
我创建了一个干净的控制器并从应用程序控制器中删除了所有代码,它仍然会发生。我还能在哪里看?
-
这不是redis的一个“特性”,而不是devise/cookies吗?
-
我认为这是由设计引起的,因为它只在每次页面加载时发生在用户对象上。可能是因为 current_user 对象在每个请求中都是不相等的,并且每次都以不同的方式序列化。所以redis找不到以前的key,它会创建一个新的key。但我不知道为什么它总是不同,从哪里看
标签: ruby-on-rails devise