16

Tôi đang sử dụng bootstrap3-datetimepicker-rails đá quý để cho phép người dùng lưu trữ các scheduled_date của một WorkOrder trong ứng dụng của tôi (sở hữu một 'DateTime'), nhưng tôi nhận được một lỗi argument out of range khi người dùng gửi biểu mẫu để tạo WorkOrder và ngày rất khác so với những gì được chọn bất cứ khi nào người dùng bật màn hình chỉnh sửa. Điều buồn cười là nó được sử dụng để làm việc, nhưng tôi không biết mã nào có thể thay đổi để phá vỡ nó.Đối số nằm ngoài phạm vi Rails 4 và bootstrap3-DateTimePicker-ray

tôi đã thêm các phụ thuộc cần & bao gồm các chỉ thị thích hợp trong file CSS/JS của tôi:

gem 'momentjs-rails', '~> 2.5.0' 
gem 'bootstrap3-datetimepicker-rails', '~> 3.0.0' 

Theo như tôi có thể nói, mã của tôi trông giống với ví dụ về tài liệu. Dưới đây là đoạn hình thức của tôi:

<div class="row"> 
    <div class="col-md-4"> 
     <div class="form-group"> 
     <%= f.label :scheduled_date %> 
     <div class='input-group date'> 
      <span class="input-group-addon"><span class="fa fa-calendar"></span></span> 
      <%= f.text_field :scheduled_date, class: 'form-control input-lg', id: "service_date_picker" %> 
     </div> 
     </div> 
    </div> 
    </div> 


    <script type="text/javascript"> 
     $(function() { 
     $('#service_date_picker').datetimepicker({ 
      icons: { 
      time: "fa fa-clock-o", 
      date: "fa fa-calendar", 
      up: "fa fa-arrow-up", 
      down: "fa fa-arrow-down" 
      } 
     }); 
     }); 
    </script> 

EDIT (quên thêm mã điều khiển - siêu đơn giản):

work_orders_controller.rb

def create 
    @work_order = WorkOrder.new(work_order_params) 

    ... [it errors on the line above] 
end 

Và whitelist tham số của tôi:

def work_order_params 
    params.require(:work_order).permit(:caller_name, :brief_job_details, :contract_price, :quoted_by, :job_description, :scheduled_date, :time_materials_details, :sheduled_time, :contact_name, :payment_method, :notes, :customer_id, :job_site_id) 
end 

Và ví dụ về tham số s mà cung cấp cho các lỗi argument out of range khi tôi lưu các hình thức:

work_orders_attributes"=>{"0"=>{"caller_name"=>"Justin", "time_materials_details"=>"", "contract_price"=>"", "quoted_by"=>"", "payment_method"=>"", "job_description"=>"", "scheduled_date"=>"05/23/2014 1:28 PM", "notes"=>""}} 

Tương tự như customers_controller.rb tôi, nơi tôi có một hình thức lồng nhau cho một WorkOrder bên trong các hình thức khách hàng mới (mọi thứ khác trên hình thức mà hoạt động hoàn hảo):

def create 
    @customer = Customer.new(customer_params) 

    ... [errors above] 
end 

Ngày và giờ tiết kiệm chính xác nếu trong vòng 24 giờ, nhưng ngay cả khi nó lưu chính xác, ngày hiển thị hoàn toàn lạ và không định dạng trong trường văn bản khi tôi chỉnh sửa WorkOrder. Ví dụ:

Khi tôi chọn ngày từ bộ chọn ngày: 05/06/2014 10:28 AM

Khi tôi chỉnh sửa WorkOrder: 2014-06-05 10:28:00.000000

Bất kỳ ý tưởng? Bất kỳ tuỳ chọn nào về việc tôi có nên tạo trường đó là Date, Time hoặc DateTime (hiện tại) không? Ngay bây giờ, chúng tôi đang làm việc ở múi giờ Trung tâm, nhưng điều đó không phải lúc nào cũng đúng.

Cảm ơn bạn đã chỉ cho tôi đúng hướng!

+0

có thì bạn nhận được lỗi? trong bộ điều khiển? mã điều khiển ở đâu? –

+0

@UriAgassi: Đã thêm mã điều khiển theo yêu cầu. Nó không phải là một vấn đề với phương pháp danh sách trắng tham số mạnh mẽ của tôi trong bộ điều khiển của tôi, vì vậy tôi đã không bao gồm phương pháp đó. –

+1

Hãy giúp chúng tôi giúp bạn! Nếu bạn biết lỗi nằm trong dòng đầu tiên, bạn không nghĩ _values_ của 'customer_params' và' work_order_params' có liên quan –

Trả lời

12

@Uri Agassi đúng: đó là giá trị bạn đang chuyển để tạo WorkOrder phù hợp nhất ở đây.

Thử bỏ qua xung quanh với custom date formatting options được cung cấp cho bạn bởi bootstrap-datepicker. Nếu bạn có thể nhận được một định dạng có vẻ tốt và dễ dàng phân tích cú pháp trên chương trình phụ trợ, thì bạn sẽ muốn chặn thông số đó trước khi nó đi đến mô hình để xác thực.

Bất kể bạn sẽ định dạng gì cho định dạng ngày ở phía máy khách, bạn vẫn sẽ muốn phân tích cú pháp thành một phía máy chủ đối tượng có thể sử dụng được Date hoặc DateTime trong trình điều khiển của bạn. Check out DateTime#strptime. Bạn cũng có thể gọi #strptime trên Date.

chưa được kiểm tra, nhưng ý tưởng là có:

def create 
    order_params = work_order_params 
    order_params[:scheduled_date] = Date.strptime(order_params[:scheduled_date], 
               '%m/%d/%Y %I:%M %p') 
    @work_order = WorkOrder.new(order_params) 
end 
+0

Oh làm sao tôi nhớ bạn. Điều đó làm việc hoàn hảo. Cảm ơn bạn rất nhiều. Tôi chỉ bối rối rằng nó được sử dụng để làm việc mà không cần bất kỳ định dạng đặc biệt trước khi đi vào db, nhưng bất cứ điều gì. –

+0

điều này sẽ không làm việc cho tôi (đường ray 4.2.0). Nó sẽ không cho phép tôi chặn param và định dạng nó trước khi nó cố gắng thiết lập nó trên thuộc tính vì một lý do nào đó. – Sean

+0

@Bạn có thể cập nhật các thông số tại chỗ trước khi chúng được chuyển thành một tham số mạnh. Kiểm tra luồng ngăn xếp này: https://stackoverflow.com/questions/19399046/how-to-make-changes-to-strong-parameters-change-to-lowercase –

4

Đó là tôi giúp:
Để nộp application.js viết để chấm dứt file:

$(function() { 
    $('.datepicker').datepicker({format: 'dd-mm-yyyy'}); 
}); 
+0

Điều đó có vẻ như là một giải pháp sạch hơn nhiều so với việc phải hack lưng của tôi mã kết thúc để xử lý tiện ích đầu cuối. Tôi sẽ thử lần sau! –

+1

Trong trường hợp của tôi, đó là 'dd-mm-yy'. Gửi/lưu ok. Của 4 'y làm cho nó hiển thị 20152015 trong các hình thức. – JosephK

5

Bạn có thể loại bỏ các thay đổi từ Điều khiển tất cả cùng nhau bằng cách cập nhật các giá trị trong mô hình. Tôi cảm thấy đây là một cách tiếp cận sạch hơn (và tái sử dụng).

class Work < ActiveRecord::Base 

    def scheduled_date=(date) 
    begin 
     parsed = Date.strptime(date,'%m/%d/%Y %I:%M %p') 
     super parsed 
    rescue 
     date   
    end 
    end 

end 
+0

Tôi sẽ không bao giờ nghĩ ra điều đó một mình. Vẫn quen với MVC. Có vẻ như luôn có nhiều mã số có thể đi. Không bao giờ sử dụng 'super'. Luôn luôn học hỏi. –

+0

Tác vụ này có hoạt động nếu 'schedule_date' được cập nhật qua cập nhật hay update_attribute không? –

+0

@NickSilva Tôi không hiểu tại sao không – user1491929

2

Plugin này sử dụng moment.js. Về cơ bản bạn cần chọn định dạng thời gian bạn muốn.

dụ

$(function() { 
$('#datetimepicker').datetimepicker({format: 'MMMM Do YYYY, h:mm'}); 
}); 
Các vấn đề liên quan