2013-06-14 10 views
9

Molto nuovo per Ruby e sono rimasto bloccato per ore. Cercando ovunque e non riesci a trovare una risposta.Conversione di stringa in data prima di salvare con Rails

Quindi sto usando il bootstrap datepicker per rails gem.

Perché ho modificato il formato della data di DatePicker, non verrà memorizzato nel DB. Indovinare questo è perché l'input simple_form viene utilizzato come una stringa per evitare gli input di selezione data predefiniti applicati da simple_form.

La mia domanda è: come posso modificare/convertire una stringa come "18/06/2013" in una data precedente al suo salvataggio nel db? È meglio gestito dal controller?

mio regolatore:

# PUT /events/1 
# PUT /events/1.json 
def update 
    @event = Event.find(params[:id]) 

    # Ugghhhh I need help 
    # @event.event_date = Date.parse(params[:event_date]).to_date 

    respond_to do |format| 
    if @event.update_attributes(params[:event]) 
     format.html { redirect_to @event, :notice => 'Event was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render :action => "edit" } 
     format.json { render :json => @event.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

DB Schema:

create_table "events", :force => true do |t| 
    t.string "event_name" 
    t.string "event_location" 
    t.date  "event_date" 
    t.time  "event_time" 
    t.text  "event_content" 
    t.datetime "created_at",      :null => false 
    t.datetime "updated_at",      :null => false 
    t.integer "user_id" 
    t.boolean "approved",  :default => true 
    t.integer "category_id" 
    end 

Questo è il log del server:

Started PUT "/events/1" for 127.0.0.1 at 2013-06-14 02:37:15 -0700 
    Processing by EventsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"RYMdJ0lFmvG0+nVIsTtJXu5fyD/L3/WAKsk9FX6WWgo=", "event"=>{"user_id"=>"1", "category_id"=>"3", "event_name"=>"A Event Name", "event_location"=>"Event Location", "event_date"=>"06/13/2013", "event_time(1i)"=>"2000", "event_time(2i)"=>"1", "event_time(3i)"=>"1", "event_time(4i)"=>"02", "event_time(5i)"=>"18", "event_content"=>"First night"}, "commit"=>"Update Event", "id"=>"1"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    Event Load (0.1ms) SELECT "events".* FROM "events" WHERE "events"."id" = ? LIMIT 1 [["id", "1"]] 
    (0.0ms) begin transaction 
    (0.0ms) commit transaction 
    Redirected to http://localhost:3000/events/1 
    Completed 302 Found in 4ms (ActiveRecord: 0.3ms) 
+1

Vorrei solo suggerire di modificare i nomi dei campi, è ridondante chiamare l'attributo Event nome_evento, posizione_evento, evento _... –

+0

Sì, d'accordo. Grazie per il consiglio. –

risposta

15

È possibile utilizzare strptime nel controller.

DateTime.strptime("06/18/2013", "%m/%d/%Y") 
+0

Questo è quello che ho fatto quando avevo lo stesso problema. –

+2

Ho ricevuto l'errore: nessuna conversione implicita di nil in stringa –

+0

Quindi probabilmente il primo argomento non viene passato. Verifica se il valore è impostato per primo, per aggiungere .to_s (ma anche questo potrebbe fallire o tornare al 1 ° gennaio 1970) –

0

la correttezza dovrebbe essere

DateTime.strptime ("2014/02/06", "% d /% m /% Y"). Strftime ("% Y-% m-% d ")