16

Używam bootstrap3-datetimepicker-rails gem, aby umożliwić użytkownikom przechowywanie scheduled_date o WorkOrder w mojej aplikacji (mienia A 'datetime'), ale dostaję błąd argument out of range kiedy użytkownik przesyła formularz, aby utworzyć WorkOrder, a data różni się znacznie od tej, która została wybrana za każdym razem, gdy użytkownik otworzy ekran edycji. Zabawne jest to, że kiedyś działało, ale nie wiem, jaki kod mógł się zmienić, by go złamać.Argument poza zakresem Rails 4 i bootstrap3-DateTimePicker szyn

dodałem wymaganych zależności & dołączone odpowiednie wytyczne w moich plikach CSS/JS:

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

O ile mogę powiedzieć, mój kod wygląda identycznie jak na przykład w dokumentacji. Oto fragment mojego formularza:

<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 (zapomniałem dodać kod Controller - super proste):

work_orders_controller.rb

def create 
    @work_order = WorkOrder.new(work_order_params) 

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

A mój parametr whitelist:

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 

A przykładowy parametr s, które dają błąd argument out of range kiedy zapisać formularz:

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"=>""}} 

Taki sam jak moi customers_controller.rb gdzie mam zagnieżdżonego formularza dla WorkOrder wewnątrz nowej formie klienta (wszystko inne w tej formie działa idealnie):

def create 
    @customer = Customer.new(customer_params) 

    ... [errors above] 
end 

Data i godzina są zapisywane poprawnie, jeśli upłyną w ciągu 24 godzin, ale nawet jeśli zapisano poprawnie, data wyświetla się zupełnie dziwacznie i niesformatowana w polu tekstowym, kiedy zaczynam edytować WorkOrder. Na przykład:

Kiedy wybrać datę z wyboru daty: 05/06/2014 10:28 AM

Kiedy edytować WorkOrder: 2014-06-05 10:28:00.000000

pomysłów? Jakiekolwiek preferencje dotyczące tego, czy powinienem wykonać to pole jako Date, lub (obecnie)? W tej chwili pracujemy w centralnej strefie czasowej, ale nie zawsze tak będzie.

Z góry dziękuję za wskazanie mnie we właściwym kierunku!

+0

gdzie jesteś uzyskiwanie błąd? w kontrolerze? gdzie jest kod kontrolera? –

+0

@UriAgassi: Dodano kod kontrolera zgodnie z żądaniem. To nie jest problem z moją metodą silnego parametru białej listy w moim kontrolerze, więc nie uwzględniłem tej metody. –

+1

Pomóż nam pomóc! Jeśli wiesz, że błąd występuje w pierwszym wierszu, nie sądzisz, że wartości _values_ 'customer_params' i' work_order_params' są istotne –

Odpowiedz

12

@Uri Agassi ma rację: to wartości, które przechodzisz, aby utworzyć WorkOrder, które są najbardziej istotne tutaj.

Spróbuj zastaw przy pomocy custom date formatting options dostarczonej przez bootstrap-datepicker. Jeśli możesz uzyskać format, który wygląda dobrze i jest łatwy do przeanalizowania w backendach, musisz przechwycić ten parametr, zanim przejdzie do modelu do sprawdzenia poprawności.

Bez względu na to, co zrobisz z formatowaniem daty po stronie klienta, nadal będziesz chciał przetworzyć go na użyteczny serwer obiektowy Date lub DateTime w kontrolerze. Check out DateTime#strptime. Możesz również zadzwonić pod numer #strptime pod adresem Date.

Nietestowane, ale idea jest tam:

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

Och, jakże za tobą tęskniłem. To działało idealnie. Dziękuję bardzo. Jestem po prostu zakłopotany, że kiedyś pracował bez specjalnego formatowania przed wejściem do bazy, ale cokolwiek. –

+0

to przyniesie dla mnie (poręcze 4.2.0). Nie pozwolę mi przechwycić tego parametru i sformatować go, zanim spróbuje ustawić go na atrybut z jakiegoś powodu. – Sean

+0

@ Możesz zaktualizować parametry w miejscu, zanim zostaną przekazane jako silny parametr. Sprawdź ten stackoverflow: https://stackoverflow.com/questions/19399046/how-to-make-changes-to-strong-parameters-change-to-lowercase –

4

To mi pomogło:
Aby złożyć application.js pisanie do końca pliku:

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

To wydaje się bardziej czystym rozwiązaniem niż zhackowanie moich pleców kod zakończenia do obsługi widgetu front-end. Spróbuję tego następnym razem! –

+1

W moim przypadku był to "dd-mm-yy". Przesyła/zapisuje ok. The 4 'y's pokazał 20152015 w formularzu. – JosephK

5

Można usunąć modyfikacje od Sterownik wszystko razem, aktualizując wartości w modelu. Uważam, że jest to podejście o wiele czystsze (i wielokrotnego użytku).

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

Nigdy bym tego nie wymyślił sam. Wciąż przyzwyczajam się do MVC. Wydaje się, że zawsze istnieje wiele miejsc, w których można by znaleźć kod. Nigdy też nie używano "super". Zawsze się uczymy. –

+0

Czy to działa, jeśli 'schedule_date' jest aktualizowane przez update lub update_attribute? –

+0

@NickSilva Nie rozumiem, dlaczego nie – user1491929

2

Ta wtyczka wykorzystuje moment.js. Zasadniczo musisz wybrać format czasu, który chcesz.

przykład

$(function() { 
$('#datetimepicker').datetimepicker({format: 'MMMM Do YYYY, h:mm'}); 
}); 
Powiązane problemy