Rails在文件系统上存储会话

时间:2014-01-18 09:30:35

标签: ruby-on-rails session devise

我使用devise在rails上遇到了cookie存储溢出问题,看起来可能是时候使用不同的会话存储了。当然redis可以解决问题,但我不想在开发机器上使用redis。我想知道是否有像php这样的文件系统存储。我只想用它来在开发机器上存储Sessions。我搜索了谷歌,但没有找到任何具体的东西。这不应该太复杂,我相信我错过了一些明显的东西

1 个答案:

答案 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