2009-03-26 26 views

Trả lời

8

Thực tế có một cách để xóa giá trị khỏi phiên. Giống như RichH cho biết biến phiên là một phiên bản CGI :: Session. Khi nhập một cái gì đó như session[:foo] nó thực sự tìm kiếm biểu tượng đó trong một biến ví dụ @data trong đối tượng phiên. Biến dữ liệu đó là một băm.

EDIT: Có một biến thể hiện dữ liệu trong lớp CGI :: Session. Nếu bạn đi đến số docs và xem mã nguồn cho phương pháp []=, bạn sẽ thấy rằng có một thành viên @data.

Vì vậy, để xóa session[:foo] tất cả các bạn phải làm là truy cập mà @data biến từ bên trong phiên

session.data[:foo] 

Bây giờ để xóa nó:

session.data.delete :foo 

Khi bạn làm điều này không nên có nhiều foo trong biến phiên của bạn.

+0

Là accross di động tất cả các cửa hàng phiên? Có vẻ hơi thân mật vì thuộc tính dữ liệu không được đề cập trong tài liệu. – RichH

+0

Tôi thành thật không biết. Tôi phát hiện ra nó bằng cách sử dụng trình gỡ rối và kiểm tra biến phiên. Tôi đã có thể tìm thấy một chút hỗ trợ cho câu trả lời của tôi mặc dù, http://tinyurl.com/cp7ntm, kiểm tra các phương pháp cuối cùng, nơi họ chỉ định session_data = @ _session.data. Đó là điều tôi có thể tìm thấy nhiều nhất trên đó – vrish88

+0

Tôi vừa cập nhật câu trả lời của mình với một nguồn tốt hơn cho một số tài liệu về chủ đề này. – vrish88

2

Vì phiên là Ruby CGI::Session chứ không phải là băm, gọi xóa sẽ thực sự xóa phiên. Xóa không có tham số - đây là của tôi bạn đang nhận được thông báo "sai số đối số (1 hoặc 0)" khi bạn thử những gì hyuan gợi ý.

Cách được chấp nhận chung để xóa mục nhập phiên là với phiên [: foo] = nil như bạn đề xuất. Nó là xa lý tưởng, nhưng các câu như phiên [: foo] .nil? sẽ hoạt động như mong đợi.

Tôi thực sự muốn nó hoạt động như một Hash bình thường ... nhưng nó không.

72

Có vẻ như phiên bản đơn giản nhất hoạt động. Tất cả các cửa hàng (Cookie, Tệp, ActiveRecord, ...) sử dụng AbstractStore::SessionHash làm đối tượng chứa dữ liệu, các cửa hàng khác nhau chỉ cung cấp phương tiện để tải và lưu các trường hợp AbstractStore::SessionHash.

AbstractStore::SessionHash thừa hưởng từ Hash, vì vậy đây trì hoãn với phương pháp Hash#delete:

session.delete(:key_to_delete) 
+0

Có vẻ như họ đã thay đổi hành vi. Điều này đã không làm việc trong Rails 2.3, theo như tôi nhớ. Cảm ơn! – iGEL

+3

đây phải là câu trả lời được chấp nhận – maprihoda

Các vấn đề liên quan