2011-10-21 24 views
8

Mam pole data_rodziny, które jest przechowywane jako wartość datetime. Domyślne szyny tworzą pomocników wypluwają niezbyt przyjazny format, np. "2008-06-10 22: 33: 19.000000". Poniżej znajduje się sposób na wanilię.Szyny: Przyjazny dla człowieka format daty dla pola tekstowego

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

Jak mogę po prostu zastosować format? Próbowałem różnych podejść, na przykład strftime powinno działać, pomyślałem. Ale gdy próbuję następujące, pojawia się błąd 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> 

oparciu o pewne inne pytania/odpowiedzi, próbowałem następujące. Działa dla wartości innych niż null, ale jest to brzydki kod i nie działa dla pustych wartości (faktycznie pokazuje dzisiejszą datę).

<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> 

W zabawy, wydaje się, że wyprowadzanie f.object.birth_date traktowana jest jako data, zamiast datetime. Jednak podczas wyświetlania w polu tekstowym (oryginalne, brzydkie formatowanie) zawiera on czas. Jest piątkowe popołudnie, a mój wspólny brak znajomości z szynami i rubinowymi obiektami daty/czasu sprawia, że ​​czuję się głupio.

Każdy prosty sposób, aby mój formularz nie wyświetlał nic, jeśli jest pusty/pusty, a przyjazna data jest inna?

Odpowiedz

10

Jeśli chcesz pusty ciąg jeśli birth_date jest pusty, należy po prostu sprawdzić, czy birth_date jest nie- nil wcześniej:

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

ten sposób, gdy birth_date jest nil, :value zostanie ustawiony na nil.

+0

Dzięki, robię to, czego potrzebuję. Byłem zdezorientowany, dlaczego to nie powoduje błędu, gdy robi to bez sprawdzania zerowego. Myślę, że mam to teraz posortowane. Robi to, co chcę (choć nadal wydaje się dużo kodu). –

+0

Nie ma za co. Powodem, dla którego powoduje błąd bez sprawdzenia 'nil' jest to, że gdy' f.object.birth_date' jest 'nil', spróbujesz wywołać' strftime' na nim. Ponieważ 'nil' nie ma metody" strftime ", zgłasza błąd. – Claw

3

Czy próbowałeś użyć metody pomocnika konstruktora formularzy date_select? Możesz także użyć datetime_select, ale wygląda na to, że chcesz po prostu pracować z datą tutaj.

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

docs API tutaj: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select Dodaj na opcjach trzeba.

Zawsze używałem tego podejścia lub selektora daty javascript, takiego jak this z jQuery UI. Obecnie istnieją wtyczki dla większości frameworków JS.

Jeśli MUSI być polem tekstowym, użyj ludzkiej biblioteki parsującej daty, takiej jak chronic. To zadziała, ale będzie wymagało przeanalizowania danych wejściowych z formularza przed zastosowaniem atrybutu do obiektu.

+0

W końcu pójdę do próbnika dat. Dzięki za udostępnienie date_select, wcześniej tego nie używałem. Jednak nie podoba mi się to jako interfejs. Wpisywanie daty tekstu ludzkiego wydaje się lepsze. Osobiście wolę hybrydę selektora obsługującego javascript, który pozwala również ręcznie wpisywać datę (jak wskazana opcja jquery). –

Powiązane problemy