2009-09-14 29 views
22

Czy istnieje prosty sposób sformatowania wyświetlania wartości DateTime w widoku Railsy?Format DataTime w polu tekstowym w szynach

Na przykład, jeśli robię coś takiego:

<%= text_field :my_object, :start_date %> 

i tylko chcesz wyświetlić datę część :start_date (czyli chcę, aby ukryć część czasu), czy istnieje sposób na format ciąg :start_date wewnątrz widoku, który będzie działał w celu tworzenia nowych elementów my_object i aktualizowania nowych elementów my_object?

Tylko wyjaśnienie:

Doing

<%= text_field 
     :my_object, 
     :start_date, 
     :value => @my_object.start_date.strftime('%m/%d/%Y') %> 

działa pięknie gdy istnieje już obiekt (czyli o aktualizacjach produktu), jednak przy tworzeniu nowy element, ponieważ data_początkowa początkowo zero, widok wyświetli błąd

while evaluating nil.strftime 

Odpowiedz

35

Kilka świetnych propozycji tutaj, jednak w tych przypadkach, w których naprawdę chcesz, aby data pola tekstowego była sformatowana w określony sposób (powiedzmy, że integrujesz się z selektorem daty javascript), a Ty zajmujesz się nilsami, myślę, że po prostu dokonywania drobnych uszczypnąć do istniejącej metody by rade:

:value => (@object.start_date.blank? ? '' : @object.start_date.strftime('%m/%d/%Y')) 
+0

Na końcu brakuje końcówki zamykającej, ale w przeciwnym razie to jest to, co zrobiłem na początku. W końcu zdecydowałem się na zainicjowanie 'start_date' na aktualną datę w obiekcie, aby' start_date' nigdy nie było 'nil' na pierwszym miejscu. – jerhinesmith

+0

Nawet czyściej: wartość: (@ object.start_date.strftime ("% m /% d /% Y"), chyba że @ object.start_date.blank?) –

+0

@ OleHenrikSkogstrøm zero to nie to samo, co pusty ciąg znaków (który to datepickers Użyłem wymaganych). Zdecydowanie użyj tego, chyba że tak, ale jeśli to działa dla ciebie. –

4

Jeśli forma R jest przywiązany do obiektu, (coś jak <% form_for(:object) do |f| %>) należy użyć <%= f.text_field :start_date, :value => f.object.start_date.to_s(:date_format) %>

możesz zarejestrować swoją :date_format w config/environment.rb

Nie wiem, dlaczego chcesz to zrobić, ale mam nadzieję, że to wyłącznie do celów prezentacji.

+1

Chodzi głównie o to, aby nie dopuścić do tego, aby ktoś pomyślał, że musi lub powinien poświęcić trochę czasu. Dla większości użytkowników "2019-09-10 17:00:18" po prostu nie jest przyjazny. Wolałbym wyświetlać tylko "09/10/2009", ponieważ część czasu jest zupełnie niepotrzebna dla tego, co robię. – jerhinesmith

+0

następnie powinieneś użyć helpera select_date zamiast zwykłego wejścia – Eimantas

+0

Zgadzam się, jeśli chodzi o wybór daty, pomocnik kalendarza lub help_na_data to lepsze podejście – Yaraher

7

mogę myśleć o trzy sposoby:

1) stworzenie nowej metody na modelu, który byłby sformatować datę jednak trzeba go będzie

2) Tworzenie metody pomocnika, który zrobi to samo

3) czy próbowałeś robić:

<%= text_field 
    :my_object, 
    :start_date, 
    :value => @my_object.try(:start_date).try(:strftime,'%m/%d/%Y') %> 
+0

Numer 3 działał pięknie dla mnie. Dzięki. – brad

2

W moim application_helper.rb kładę

def nice_date_form(the_date) 
    return the_date.strftime('%d-%m-%Y') 
end 

W każdym edit.html.erb plik widok z datepicker jQuery I wtedy użyć:

<% if @activity.end_date? %> 
    <%= f.text_field :end_date, :value => nice_date_form(@activity.end_date) %> 
<% else %> 
    <%= f.text_field :end_date %> 
<% end %> 
+0

Czy to nie spowoduje błędu, jeśli 'the_date' będzie zerowe? – jerhinesmith

+0

@jerhinesmith Masz absolutne prawo. Nie przetestowałem tego poprawnie. Zmieniłem powyższy kod, aby przetestować zero. Można to również zrobić tak, jak zrobił to Dave Rapin, w miłym jednym liniowcu. –

+0

co, jeśli zmieniłeś 'nice_date_form' na coś' return (the_date? The_date.strftime ('% d-% m-% Y'): '') '. Wtedy powinieneś być w stanie usunąć warunkowe z widoku. – jerhinesmith

0

W pomocnika

def l(value, options = {}) 
    return nil unless value.present? 
    value = value.to_date if value.is_a? String 
    super(value, options) 
end 

Następnie w widoku

<%= f.text_field :end_date, class: "datepicker" :value => l(@activity.end_date) %> 

Tutaj l jest pomocnikiem szyny (I18n.l), które mogą być locale specyficzne i może mieć format. Przykłady:

l(@activity.end_date, format: :short) 
l(@activity.end_date, format: "%d-%m-%Y") 
1

można to uzyskać na sucho warstwy modelu za pomocą szyn dostarczonego <attribute>_before_type_cast metody wariant. Railsy już używają tej metody do robienia właśnie tego typu formatowania, więc po prostu nadpisujemy domyślne. Na przykład:

class MyModel 
    def start_date_before_type_cast 
     return unless self[:start_date] 
     self[:start_date].strftime('%m/%d/%Y') 
    end 
end 

ten sposób, gdziekolwiek masz pole tekstowe dla data_początkowa dziedzinie MyModel # Ci formatowania za „free”.

Powiązane problemy