2010-10-28 27 views
7

Ngày của Hoa Kỳ được sử dụng để được chấp nhận/phân tích cú pháp chính xác, nhưng không còn trong Rails 3.% Y-% m-% d được chấp nhận nhưng không phải% m /% d /% Y.Cách đặt định dạng ngày của Hoa Kỳ làm mặc định khi lưu vào mô hình trong Rails 3

g = Grant.new 
g.budget_begin_date = '12/31/2010' 
#g.budget_begin_date returns nil 
g.budget_begin_date = '2010-12-31' 
#g.budget_begin_date returns Fri, 31 Dec 2010 00:00:00 UTC +00:00 

Trả lời

4

Như của Ruby 1,9, Date.parse ngừng xử lý nhập nhằng định dạng mm/dd/yyyy (định dạng American) hoặc dd/mm/yyyy (phần còn lại của định dạng văn minh thế giới).

american_date gem linked here làm cho giả định cũ hơn của Ruby đã làm, và do đó có thể phân tích một ngày Mỹ như mong đợi.

1

Nếu bạn không phải là không thích sử dụng một viên ngọc, bạn có thể kiểm tra đá quý mãn tính: https://github.com/mojombo/chronic

Bạn có thể mãn tính phân tích ngày bắt đầu của bạn trước khi lưu mô hình.

0

Lớp ngày gọi phương thức self.parse để phân tích chuỗi được cung cấp cho đến nay.

1.9.2p320 :051 > x = Date.parse('2011-31-12') 
ArgumentError: invalid date 
from .../rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/date.rb:1022:in `new_by_frags' 
from .../rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/date.rb:1066:in `parse' 

đó là lần lượt gọi là tự phương pháp "_parse" mà nằm trong file ".../ruby-1.9.2-P320/lib/ruby ​​/ 1.9.1/ngày/format.rb" .

nó gọi hàm strftime ("def strftime (fmt = '% F')") ở định dạng mặc định cho ngày tạo thành "% F" theo tài liệu Lớp thời gian là "% F - ISO 8601 định dạng ngày (% Y-% m-% d) ".

4

Ví dụ mã của bạn không hiển thị Date.parse không diễn giải ngày theo phong cách của Hoa Kỳ, nhưng bạn nói đúng, nó không đúng. Thay vì điều này:

Date.parse("12/31/2010") 

Sử dụng này:

Date.strptime("12/31/2010", "%m/%d/%Y") 
0

Trong ruby ​​hiện đại (ví dụ: prepend), bạn có thể chèn kiểu nhập của riêng mình trước Rails. Bạn sẽ muốn thực hiện việc này cho bất kỳ định dạng ngày/giờ nào khác mà bạn đang sử dụng. Dưới đây là đoạn code cho Date, chỉ cần dính này trong một config/initializers/typecasts.rb hoặc ở đâu đó:

module Typecasting 
    module Date 
    def cast_value v 
     ::Date.strptime v, "%m/%d/%Y" rescue super 
    end 
    end 

    ::ActiveRecord::Type::Date.prepend Date 
end 

Rails sẽ cố gắng định dạng Mỹ và quay lại sử dụng phương pháp dựng sẵn nếu điều đó không làm việc.

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