2011-10-21 28 views
8

Tôi có trường ngày sinh được lưu trữ dưới dạng giá trị ngày giờ. Các trình trợ giúp biểu mẫu đường ray mặc định tạo ra một định dạng không thân thiện, ví dụ: "2008-06-10 22: 33: 19.000000". Dưới đây là đường ray vanilla.Đường ray: Định dạng ngày thân thiện với con người cho text_field

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :size=>"20" %> 
</div> 

Tôi có thể áp dụng định dạng đơn giản bằng cách nào? Tôi đã thử các cách tiếp cận khác nhau, ví dụ như strftime nên hoạt động, tôi nghĩ. Nhưng khi tôi thử những điều sau đây, tôi nhận được một lỗi undefined method 'strftime' for nil:NilClass

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :value=>f.object.birth_date.strftime('%m/%d/%Y'), :size=>"20" %> 
</div> 

Dựa trên một số câu hỏi/câu trả lời khác, tôi đã cố gắng như sau. Nó hoạt động cho các giá trị không null, nhưng nó là mã xấu, và nó không hoạt động cho các giá trị trống (thực sự nó cho thấy ngày hôm nay).

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :value=> Time.parse(f.object.birth_date.to_s).strftime('%m/%d/%Y'), :size=>"20" %> 
</div> 

Khi chơi xung quanh, có vẻ như xuất f.object.birth_date được coi là ngày, thay vì ngày giờ. Tuy nhiên, khi được hiển thị trong text_field (định dạng gốc, xấu), nó bao gồm thời gian. Đó là buổi chiều thứ sáu, và sự thiếu hiểu biết kết hợp của tôi với các hình thức đường ray và các đối tượng ngày/giờ của ruby ​​khiến tôi cảm thấy ngu ngốc.

Bất kỳ cách đơn giản nào để biểu mẫu của tôi hiển thị không có gì nếu trống/trống và một ngày thân thiện khác?

Trả lời

10

Nếu bạn muốn có một chuỗi trống nếu birth_date là trống rỗng, bạn chỉ nên kiểm tra xem birth_date là phi nil trước:

<%= f.text_field :birth_date, :value => (f.object.birth_date.strftime('%m/%d/%Y') if f.object.birth_date), :size => "20" %> 

Bằng cách này, khi birth_date là nil, :value được thiết lập để nil.

+0

Cảm ơn, hãy làm những gì tôi cần. Tôi đã nhầm lẫn lý do tại sao điều này không ném một lỗi khi làm điều đó mà không có kiểm tra nil không. Tôi nghĩ rằng tôi có nó được sắp xếp ngay bây giờ. Điều này làm những gì tôi muốn (mặc dù vẫn còn có vẻ như rất nhiều mã). –

+0

Bạn được chào đón. Lý do tại sao nó ném một lỗi mà không có kiểm tra 'nil' là bởi vì khi' f.object.birth_date' là 'nil', bạn sẽ thử gọi' strftime' trên nó. Bởi vì 'nil' không có phương thức' strftime', nó ném lỗi. – Claw

3

Bạn đã thử sử dụng phương pháp trợ giúp trình xây dựng biểu mẫu date_select? Bạn cũng có thể sử dụng datetime_select, nhưng có vẻ như bạn chỉ muốn làm việc với ngày ở đây.

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.date_select :birth_date %> 
</div> 

Các tài liệu API đang ở đây: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select Thêm vào các tùy chọn mà bạn cần.

Tôi đã luôn sử dụng phương pháp đó hoặc công cụ chọn ngày javascript như this từ giao diện người dùng jQuery. Có nhiều plugin cho hầu hết các khung công tác JS trong những ngày này.

Nếu nó PHẢI là một text_field, hãy sử dụng thư viện phân tích cú pháp ngày ngôn ngữ của con người như chronic. Nó sẽ hoạt động, nhưng sẽ yêu cầu bạn phân tích cú pháp đầu vào từ biểu mẫu ở đâu đó trước khi áp dụng thuộc tính cho đối tượng của bạn.

+0

Tôi cuối cùng sẽ đi đến một bộ chọn ngày. Cảm ơn bạn đã chia sẻ date_select, tôi đã không sử dụng điều đó trước đây. Tuy nhiên, tôi không thích điều đó như một giao diện. Nhập một ngày văn bản của con người có vẻ tốt hơn. Cá nhân tôi thích lai của bộ chọn bật javascript cũng cho phép bạn nhập một ngày (giống như tùy chọn jquery mà bạn đã chỉ ra). –

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