web-dev-qa-db-fra.com

Comment ajouter un attribut de date dans les modèles Rails

Salut, je suis un débutant dans RoR et avait un peu de mal à générer un modèle particulier.

Je veux créer 2 modèles - Liste et article. La liste contient_de nombreux éléments et l'élément appartient à la liste.

Je veux que le modèle Item ait 3 attributs. Rails g model Item name:string desc:string date:????

1.Quel type de données ajouter pour date:???

2. Dans quel format sera l'attribut date? (mm/jj/aa)?

3.Et quel type de formulaire doit-il avoir?

f.date_field :date?

Merci d'avance!

12
deventhusiast

1. Quel type de données ajouter pour date:???

Dans vos migrations, vous pouvez utiliser les types suivants pour les colonnes:

:string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean

(extrait du add_column transformation ici )

Dans votre cas, si vous n'avez pas besoin de stocker l'heure, vous pouvez utiliser date:name_of_your_field.

2. Dans quel format sera l'attribut date? (mm/jj/aa)?

L'attribut sera stocké sous la forme d'un ActiveSupport::TimeWithZone, et vous devrez le formater lors de son affichage. Vous pouvez utiliser Time # strftime pour ce faire.

your_attribute.strftime("%m/%d/%Y")   #=> "11/19/2007"

3. Et quel type d'entrée de formulaire devrait-il avoir?

Oui, vous pouvez parfaitement utiliser:

f.date_field :date?

Il renverra un text_field de type "date". Selon la prise en charge du navigateur, un sélecteur de date apparaîtra dans le champ de saisie.

J'espère que ça aide! Bon codage!

17
Pablo Alonso

Vous pouvez avoir date ou datetime selon la documentation. Par conséquent:

Rails g model Item name:string desc:string date:datetime

ou

Rails g model Item name:string desc:string date:date

Mais la meilleure pratique consiste à utiliser DateTime comme une représentation générale du temps.

Bien que je l'appellerais probablement quelque chose de plus descriptif que date. (Et juste fyi created_at et updated_at les colonnes sont déjà créées pour vous.)

Le type est à peu près indépendant du format. Vous pouvez le formater avec strftime :

%Y%m%d           => 20071119                  Calendar date (basic)
%F               => 2007-11-19                Calendar date (extended)
%Y-%m            => 2007-11                   Calendar date, reduced accuracy, specific month
%Y               => 2007                      Calendar date, reduced accuracy, specific year
%C               => 20                        Calendar date, reduced accuracy, specific century
%Y%j             => 2007323                   Ordinal date (basic)
%Y-%j            => 2007-323                  Ordinal date (extended)
%GW%V%u          => 2007W471                  Week date (basic)
%G-W%V-%u        => 2007-W47-1                Week date (extended)
%GW%V            => 2007W47                   Week date, reduced accuracy, specific week (basic)
%G-W%V           => 2007-W47                  Week date, reduced accuracy, specific week (extended)
%H%M%S           => 083748                    Local time (basic)
%T               => 08:37:48                  Local time (extended)
%H%M             => 0837                      Local time, reduced accuracy, specific minute (basic)
%H:%M            => 08:37                     Local time, reduced accuracy, specific minute (extended)
%H               => 08                        Local time, reduced accuracy, specific hour
%H%M%S,%L        => 083748,000                Local time with decimal fraction, comma as decimal sign (basic)
%T,%L            => 08:37:48,000              Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L        => 083748.000                Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L            => 08:37:48.000              Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z         => 083748-0600               Local time and the difference from UTC (basic)
%T%:z            => 08:37:48-06:00            Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z  => 20071119T083748-0600      Date and time of day for calendar date (basic)
%FT%T%:z         => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z    => 2007323T083748-0600       Date and time of day for ordinal date (basic)
%Y-%jT%T%:z      => 2007-323T08:37:48-06:00   Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600      Date and time of day for week date (basic)
%G-W%V-%uT%T%:z  => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M      => 20071119T0837             Calendar date and local time (basic)
%FT%R            => 2007-11-19T08:37          Calendar date and local time (extended)
%Y%jT%H%MZ       => 2007323T0837Z             Ordinal date and UTC of day (basic)
%Y-%jT%RZ        => 2007-323T08:37Z           Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z   => 2007W471T0837-0600        Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z  => 2007-W47-1T08:37-06:00    Week date and local time and difference from UTC (extended)

Merci à @BWStearns pour cette citation

Enfin en ce qui concerne le champ de saisie: jetez un œil à ces aides de formulaire .

<%= date_field(:user, :born_on) %>
<%= datetime_field(:user, :meeting_time) %>
<%= datetime_local_field(:user, :graduation_day) %>
12
wpp