2013-06-14 30 views
9

Rất mới đối với Ruby và tôi đã bị kẹt hàng giờ liền. Tìm kiếm ở khắp mọi nơi và không thể tìm thấy câu trả lời.Chuyển đổi chuỗi thành ngày trước khi lưu với Rails

Vì vậy, tôi đang sử dụng công cụ datepicker khởi động cho đá quý ray.

Vì tôi đã thay đổi định dạng ngày của datepicker, nó sẽ không lưu trữ trong DB. Đoán điều này là do đầu vào simple_form đang được sử dụng như một chuỗi để tránh các đầu vào lựa chọn ngày mặc định được áp dụng bởi simple_form.

Câu hỏi của tôi là: Làm cách nào để sửa đổi/chuyển đổi chuỗi như "06/18/2013" thành ngày trước khi được lưu vào db? Điều này có được xử lý tốt nhất bởi bộ điều khiển không?

điều khiển của tôi:

# 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 

Đây là nhật ký máy chủ:

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

Tôi chỉ đề nghị bạn có thể thay đổi tên trường, không cần thiết để gọi thuộc tính Event event_name, event_location, event _... –

+0

Yea, đã đồng ý. Cảm ơn vì tiền hỗ trợ. –

Trả lời

15

Bạn có thể sử dụng strptime trong bộ điều khiển.

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

Đó là những gì tôi đã làm khi có cùng một vấn đề. –

+2

Tôi gặp lỗi: không chuyển đổi ẩn nil thành chuỗi –

+0

Vì vậy, có lẽ đối số đầu tiên không được chuyển. Kiểm tra xem giá trị có được đặt trước hay không, để thêm .to_s (nhưng điều đó có thể không thành công hoặc trả về ngày 1 tháng 1 năm 1970) –

0

Các điều đúng nên

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

Các vấn đề liên quan