2013-06-14 8 views
9

Sehr neu in Ruby und ich habe seit Stunden festgefahren. Überall suchen und keine Antwort finden.Konvertieren String in Datum vor dem Speichern mit Rails

Also benutze ich den Bootstrap Datepicker für Schienen gem.

Da ich das Datumsformat des Datepickers geändert habe, wird es nicht in der DB gespeichert. Das liegt daran, dass die Eingabe simple_form als Zeichenfolge verwendet wird, um die von simple_form angewendeten Standardeingaben für die Datumsauswahl zu vermeiden.

Meine Frage ist: Wie kann ich eine Zeichenfolge wie "06/18/2013" zu einem Datum ändern/konvertieren, bevor es in der Datenbank gespeichert wird? Wird dies am besten vom Controller gehandhabt?

Mein Controller:

# 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 

Dies ist der Server-Log:

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

Ich würde nur vorschlagen, dass Sie möglicherweise Feldnamen ändern, es ist redundant, Ereignisattribut event_name, event_location, event _... aufzurufen –

+0

Ja, einverstanden. Danke für den Tipp. –

Antwort

15

Sie können strptime im Controller verwenden.

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

Das habe ich gemacht, als ich dasselbe Problem hatte. –

+2

Ich bekomme den Fehler: keine implizite Umwandlung von Nil in String –

+0

Also wahrscheinlich ist das erste Argument nicht bestanden. Überprüfen Sie, ob der Wert zuerst gesetzt wird, um .to_s hinzuzufügen (aber das kann auch fehlschlagen oder 1 Jan 1970 zurückgeben) –

0

Die soll richtigen

DateTime.strptime ("2014.02.06", "% d /% m /% Y"). Strftime ("% Y-% m-% liegt d ")

Verwandte Themen