我使用devise在rails上遇到了cookie存储溢出问题,看起来可能是时候使用不同的会话存储了。当然redis可以解决问题,但我不想在开发机器上使用redis。我想知道是否有像php这样的文件系统存储。我只想用它来在开发机器上存储Sessions。我搜索了谷歌,但没有找到任何具体的东西。这不应该太复杂,我相信我错过了一些明显的东西
答案 0 :(得分:3)
由于Rails具有管理会话的分离方式,因此您可以实现使用文件存储其数据的自定义会话存储。 但是,请记住,这必须严格用于开发,文件I / O速度无法与RAM一样快,并且可能成为应用程序的严重瓶颈。
这里是使用文件系统的自定义会话存储的完整实现(代码不是我的,链接在最后)
class CustomFileStore < ActionDispatch::Session::AbstractStore
def get_session(env, session_id)
session_data = {}
session_id ||= generate_sid
File.open(tmp_file(session_id),'r') do |f|
data = f.read
session_data = ::Marshal.load(data) unless data.empty?
end rescue nil
[session_id, session_data]
end
def set_session(env, session_id, session_data, options)
File.open(tmp_file(session_id), 'w+') do |f|
encoded = ::Marshal.dump(session_data)
f.write(encoded)
end
session_id
end
def destroy_session(env, session_id, options)
File.unlink(tmp_file(session_id)) if File.exists?(tmp_file(session_id))
generate_sid
end
def tmp_file(session_id)
File.join(Rails.root, 'tmp', 'sessions', session_id)
end
end
将其保存为“lib”文件夹中的“custom_file_store.rb”,然后使用“config / initializers / session_store.rb”中的以下代码配置您的应用程序以使用它 (使用您的应用程序名称更改RailsApp)
RailsApp::Application.config.session_store :custom_file_store
这就是全部! 查看此代码原作者的文章: http://bradpauly.com/blog/2013-02-01-rails-3-custom-session-store.html