Làm thế nào để trống / phá hủy một phiên trong đường ray?


133

Tôi dường như không thể tìm thấy nó ở bất cứ đâu ... Làm cách nào để xóa / hủy / đặt lại / bỏ trống / xóa phiên của người dùng trong Rails? Không chỉ một giá trị mà toàn bộ ..

Câu trả lời:


203

Để xóa toàn bộ, hãy sử dụng phương thức reset_session trong bộ điều khiển.

reset_session

Đây là tài liệu về phương pháp này: http://api.rubyonrails.org/groupes/ActionControll/Base.html#M000668

Đặt lại phiên bằng cách xóa tất cả các đối tượng được lưu trữ bên trong và khởi tạo một đối tượng phiên mới.

Chúc may mắn!


1
Đối với các phiên dựa trên cơ sở dữ liệu (mà bạn có thể nên sử dụng), bạn có thể hết hạn thông qua truy vấn: guide.rubyonrails.org/security.html#session-Exiry
m33lky

44

phiên trong rails là một đối tượng băm. Do đó, bất kỳ chức năng nào có sẵn để xóa hàm băm sẽ hoạt động với các phiên.

session.clear

hoặc nếu các khóa cụ thể phải bị hủy:

session.delete(key)

Đã thử nghiệm trên đường ray 3.2

thêm

Mọi người đã đề cập đến session={}là một ý tưởng tồi. Về session.clear, các ý kiến ​​của lobati - Có vẻ như bạn có thể tốt hơn khi sử dụng reset_session [so với session.clear], vì nó có một số cách làm sạch khác ngoài những gì session.clear làm. Trong nội bộ, reset_session gọi session.destroy , bản thân nó cũng gọi rõ ràng một số nội dung khác.


Bất cứ ai cũng có bất kỳ suy nghĩ về giá trị của phương pháp này so với đề xuất của Gdeglin?
Peter Berg

3
Điều này có thể được sử dụng khi bạn muốn giữ lại các tham số khác nhưng xóa một cặp giá trị khóa cụ thể.
Lavixu

1
Điều này sẽ không thiết lập lại phiên nào cả, nó sẽ chỉ định một biến cục bộ. Không bao giờ sử dụng kỹ thuật này để đặt lại phiên: session = {}
alexspeller

4
Các tài liệu Rails , trên phần 5.1 Truy cập vào phiên khuyến cáo sử dụng reset_session nếu bạn muốn loại bỏ cặp khóa / giá trị script chèn (ví dụ: Một cái gì đó chèn từ một bộ điều khiển) và tạo ra một phiên làm việc mới. Nếu bạn chỉ muốn đặt lại các cặp khóa / giá trị bạn đã đặt, hãy đặt các khóa đó thành không.
sargas

1
@barlop Có vẻ như bạn có thể sử dụng tốt hơn reset_session, vì nó làm một số việc khác ngoài việc session.clearlàm. Trong nội bộ, reset_sessioncác cuộc gọisession.destroy , mà chính nó cũng gọi clearmột số thứ khác .
lobati

6

để xóa phiên của người dùng

session.delete(:user_id)

Cẩn thận, bạn có thể xóa hồ sơ người dùng từ cơ sở dữ liệu!
Arthur

2
@Arthur Điều đó không đúng. Nhưng bạn sẽ chỉ xóa khóa: user_id khỏi phiên chứ không phải toàn bộ phiên
Andión

5

Để chỉ xóa một số tham số nhất định, bạn có thể sử dụng:

[:param1, :param2, :param3].each { |k| session.delete(k) }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.