2014-01-18 29 views
1

我使用設計的軌道運行到一個cookie存儲溢出問題,它看起來像它可能是時間使用不同的會話存儲。當然redis會解決這個問題,但我不想在開發機器上使用redis。我想知道是否有像php這樣的文件系統商店。我只是想用它來將Sessions存儲在開發機器上。我搜索了谷歌,但沒有找到具體的東西。這不應該是太複雜了,我相信我失去了一些東西明顯Rails的存儲會話上的文件系統

+0

爲什麼你不能使用redis?這是您的要求的正確解決方案。說了這麼多,你實際上是尋找在本地打開一個文件,寫它,然後再把它讀你的Rails應用裏面的方法? – SudoGuru

+0

不,我正在尋找使用php等文件的會話存儲。我不想在我的開發機器上安裝redis,就這些。此外,由於我使用Windows和Linux之間的2檯筆記本電腦和備用很多時候,我真的不希望安裝的Redis上所有的人。一個文件系統適合我的開發需求。我將使用Redis的商店進行生產(或測試) –

+0

@SomeshMukherjee我不知道它是在Windows上如何複雜,但在Linux上建立的Redis不低於'命令和apt-get安裝redis'(或'須藤yum的更多安裝redis')。你只需執行'redis-server'就可以運行它(如果你不想要,不需要配置)。 – panzi

回答

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 

另存爲「custom_file_store.rb」中的「LIB」文件夾,然後配置你的應用程序使用「配置/初始化/ 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

相關問題