2013-03-16 21 views
9

Tôi muốn cho phép người dùng ứng dụng của tôi chỉ định múi giờ và sau đó đặt múi giờ của họ ở đầu mỗi yêu cầu. Trong Rails, AFAICT, điều này được thực hiện bằng cách đặt đối tượng đơn lẻ:Cài đặt Time.zone trong khi yêu cầu: Chủ đề an toàn?

Time.zone = "America/Los_Angeles" 

Hiểu biết của tôi về thực tiễn tốt nhất là, nói chung, một singleton nên được đặt ONCE. Ví dụ trong cấu hình ứng dụng.

Từ một câu trả lời cho một câu hỏi tương tự, có người đề nghị thiết lập nó trong ApplicationController

class ApplicationController < ActionController::Base 
    before_filter :set_timezone 
    def set_timezone 
    # current_user.time_zone #=> 'London' 
    Time.zone = current_user.time_zone if current_user && current_user.time_zone 
    end 
end 

là an toàn không? Hay tôi có nguy cơ gặp một chủ đề khác không? Tôi sẽ thử chạy thử nghiệm này nhưng nó không phải là kịch bản thử nghiệm dễ nhất bao giờ nên tôi nghĩ tôi nên xem nếu ai đó đã làm điều này.

Trả lời

16

Nếu bạn nhìn vào code nơi điều này được triển khai, bạn có thể thấy vùng hiện tại được lưu trữ trong biến cục bộ, vì vậy mỗi luồng có thể đặt Time.zone mà không can thiệp vào các luồng khác.