7

Đoạn mã dưới đây chắc chắn rằng một time_zone chọn nằm trong múi giờ trong ActiveSupport::TimeZone.us_zones:validates_inclusion_of không còn hoạt động như cũ trong Rails 4.1?

validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name) 

Làm việc tuyệt vời trong Rails 4.0. Chỉ cần nâng cấp lên Rails 4.1 và tôi nhận được lỗi này trên trang chỉ mục của tôi (chỉ cần xem các mô hình):

Một đối tượng với phương pháp #include? hoặc một proc, lambda hoặc biểu tượng được yêu cầu, và phải được cung cấp như: trong (hoặc: trong vòng) tùy chọn của băm cấu hình

Tôi đoán từ đó, ActiveSupport::TimeZone.zones_map(&:name) không còn là một giá trị hợp lệ cho thuộc tính in?

Trả lời

22

thử thêm .keys?

validates :time_zone, 
    inclusion: { 
    in: ActiveSupport::TimeZone.zones_map.keys 
    } 
+1

Làm cho cảm giác, tôi nghĩ rằng nó làm việc ... Tôi nhận được rất nhiều lỗi khác bây giờ quá :(Hình như tôi sẽ chờ đợi trên đường ray 4.1 ... –

+8

Đối số khối, '&: name' không liên quan đến việc triển khai 4.1. zone_map trả về đối tượng ThreadSafe :: Cache, không phải là một hàm băm. Nó không hỗ trợ #include ? Phương thức như một cách để xác định xem khóa có tồn tại hay không. 'ActiveSupport :: TimeZone.zones_map.keys' là đủ trong 4.1. –

1

Nếu bạn muốn tiếp tục sử dụng validates_inclusion_of công trình này cũng như:

validates_inclusion_of :time_zone, 
    :in => ActiveSupport::TimeZone.zones_map(&:name).keys, 
    :message => "is not a valid time zone" 
2

Trong Rails 5, ActiveSupport::TimeZone.zones_map là một phương pháp riêng. Do đó, nếu bạn muốn xác nhận của bạn để làm việc, tôi đề nghị các cú pháp như sau:.

validates :time_zone, inclusion: { in: ActiveSupport::TimeZone.all.map(&:name) } 
Các vấn đề liên quan