2013-06-14 20 views
9

Bardzo nowy dla Ruby i utknąłem na wiele godzin. Przeszukujesz wszędzie i nie możesz znaleźć odpowiedzi.Konwertowanie ciągu na datę przed zapisaniem z Railsami

Używam więc datagramu programu startowego dla klejnotów szyn.

Ponieważ zmieniłem format daty w datepicker, nie będzie on przechowywany w DB. Odgadnięcie tego jest spowodowane tym, że wejście simple_form jest używane jako ciąg, aby uniknąć domyślnych danych wejściowych wyboru daty zastosowanych przez simple_form.

Moje pytanie brzmi: w jaki sposób zmienić/przekonwertować ciąg znaków, taki jak "06/18/2013" na datę przed zapisaniem w bazie danych? Czy to najlepiej obsługiwane przez kontroler?

Mój kontroler:

# 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 schematu:

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 

Jest to log serwera:

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

Proponuję po prostu zmienić nazwy pól, zbędne jest wywoływanie atrybutu Event event_name, event_location, event _... –

+0

Zgadzam się. Dzięki za wskazówkę. –

Odpowiedz

15

Można użyć strptime w kontrolerze.

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

To właśnie zrobiłem, gdy miałem ten sam problem. –

+2

Otrzymuję błąd: brak niejawnej konwersji zera do łańcucha znaków –

+0

Prawdopodobnie pierwszy argument nie zostanie przekazany. Sprawdź, czy wartość jest ustawiona jako pierwsza, aby dodać .to_s (ale może to również się nie powieść lub powrócić 1 stycznia 1970) –

0

prawidłowa należy

DateTime.strptime ("06.2.2014", "% d /% m /% T"). Strftime ("% m-Y%% d ")

Powiązane problemy