2010-06-19 1 views
25

Đây là mã của tôi:Làm cách nào để xóa tất cả các phiên đường ray?

if session[:firsttimestart].nil? 
else 
    @firsttime = false 
end 

if @firsttime == true 
    initglobals() 
end 
session[:firsttimestart]=false 

Vấn đề là khi tôi tắt máy chủ và trở lại các ứng dụng, phiên [: firsttimestart] vẫn còn sai. Nó bằng cách nào đó lưu trữ biến này trong hệ thống của tôi mà không có ngày hết hạn để iniglobals() không được gọi. Tôi đã cố gắng sử dụng rake tmp: rõ ràng và nó không hoạt động. Làm thế nào tôi có thể xóa tất cả các phiên đang sử dụng trong hệ thống của tôi mỗi lần tôi khởi động lại máy chủ của mình?

Trả lời

23

Nếu bạn đang lưu trữ các phiên của bạn trong một db sau đó

rake db:sessions:clear 
+0

Mặc dù, điều này có thể không làm giảm không gian đĩa DB của bạn. Trong postgres, tôi cần phải chạy sau đây sau khi xóa các phiên: 'VACUUM FULL ANALYZE;' và 'REINDEX table sessions;'. Trong các dbs quan hệ khác, bạn có thể cần tối ưu hóa nó. –

+0

Xem câu trả lời của @ Yevgeniy bên dưới – aceofspades

+0

Nếu bạn không sử dụng DB để lưu phiên, trên Rails 3, bạn chỉ cần thay đổi mã bí mật của ứng dụng và tất cả các phiên sẽ được đặt lại. Để thực hiện điều này, hãy chạy 'rake secret' trên dòng lệnh để tạo ra một bí mật mới và sau đó sao chép/dán nó vào tệp config/initializers/secret_token.rb của bạn. – Alberto

4

Thứ nhất, bằng không không phải là == false, tuy nhiên, con số không là false. Thử nó cho mình nếu bạn không tin:

irb(main):001:0> nil == false 
=> false 
irb(main):002:0> nil == nil 
=> true 

nào ofcourse có nghĩa là:

irb(main):003:0> false.nil? 
=> false 

Bạn có thể dọn dẹp mã của bạn theo cách sau đây vì nó có vẻ như @firsttime không bao giờ được thiết lập là true bất cứ nơi nào.

unless session[:visited] 
    session[:visited] = true 
    initglobals 
end 

Cuối cùng, rake tmp: sessions: clear sẽ chỉ hoạt động nếu bạn đang sử dụng ActiveRecordStore, nếu bạn đang sử dụng CookieStore (mặc định). Sau đó, bạn sẽ cần phải làm sạch cookie của bạn, hoặc sử dụng reset_session.

45

Cho dù đó là DB hoặc cookie lưu trữ, sử dụng rake tmp:sessions:clear

+0

Rõ ràng không thể làm việc cho lưu trữ cookie vì phiên được giữ phía khách hàng. – dolzenko

+0

@dolzenko chỉ một session_id được lưu trữ ở phía máy khách. Tất cả dữ liệu phiên được lưu trữ phía máy chủ. Vì vậy, không nên có bất kỳ lý do bạn không thể xóa các phiên cookie từ phía máy chủ. – Nick

+1

@Nick điều này chỉ đúng đối với cửa hàng phiên DB, cửa hàng cookie lưu trữ mọi mặt khách hàng, xem http://guides.rubyonrails.org/security.html#session-storage và http://api.rubyonrails.org/classes/ ActionDispatch/Session/CookieStore.html để biết chi tiết – dolzenko

5

Trong Rails 4, câu trả lời được chấp nhận (rake db:sessions:clear) không còn hoạt động vì ActiveRecord :: SessionStore được chiết xuất vào active_record-session_store đá quý. (Xem here cho giải thích thêm)

Bạn có thể bây giờ hoặc là cài đặt các active_record-session_store đá quý và sử dụng rake db:sessions:clear như trong Rails 3, hoặc tạo ra một nhiệm vụ tùy chỉnh Rake trông giống như vậy:

namespace :db do 
    namespace :sessions do 
     desc "Clear ActiveRecord sessions" 
     task :clear => :environment do 
      sql = 'TRUNCATE sessions;' 
      ActiveRecord::Base.connection.execute(sql) 
     end 
    end 
end 
2

Tôi đang sử dụng Rails 4 và giải pháp sau đây làm việc cho tôi vì tôi không muốn chạy thủ công rake db:session:clear mỗi lần tôi khởi động ứng dụng của mình.

Bên /config/initializer/session_store.rb thêm dòng sau

ActiveRecord::SessionStore::Session.delete_all 

Đây chỉ là giống như lệnh cào nhưng thực hiện ở cấp initializer.

2

Tốt nhất là thay đổi khóa bí mật khi triển khai, tất cả cookie sẽ bị vô hiệu

về mặt kỹ thuật, bạn nên cung cấp một biến thông qua biến môi trường.

http://guides.rubyonrails.org/security.html#custom-secrets

cho nhiệm vụ cào, nó trông giống như những cái mới là

rails tmp:clear 
1

Trong Rails 5 nếu sử dụng ActiveRecord:

ActiveRecord::SessionStore::Session.delete_all

hoặc cho chi tiết hơn:

# For example schedule this once a day` 
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all