2013-01-23 20 views
9

Używam Rails 3 i nie przesłać formularza, ponieważ jedno z pól nie przechodzi validates_presence_of. Mój model nazywa się dinner, a pole, które jest używane w połączeniu z datepicker, nazywa się date.Pole Railsy "nie może być puste", nawet jeśli nie jest puste

views/dinners/new.html.erb:

<%= f.text_field :date, id: "datepicker" %> 

models/dinner.rb:

attr_accessible :date 
validates_presence_of :date 

dinners_controller.rb:

def create 
    @dinner = Dinner.new params[:dinner] 
    if @dinner.save 
    flash[:notice] = "Dinner created successfully." 
    redirect_to controller: 'dinners' 
    else 
    flash.now[:alert] = @dinner.errors.full_messages.join("<br>").html_safe 
    render action: "new" 
    end 
end 

Zawsze, gdy wypełniam wszystkie pola, w tym date, pojawia się błąd "Data nie może być pusta", nawet jeśli nie jest pusta. Co tu się dzieje?

+0

Zwykle, gdy coś takiego się dzieje, uważam, że jest to parametr, który nie został zaliczony tak, jak powinien. Sprawdź dziennik serwera. Czy parametr: date jest w ogóle przekazywany? Jeśli tak, czy jest poprawnie sformatowany? Spróbuj wylogować się z obiektu '@ dinner', zanim spróbujesz go zapisać, sprawdź, czy ma ustawiony dat. – MrTheWalrus

+0

Inną rzeczą do zbadania w takich przypadkach jest zachowanie na konsoli szyn. Kiedy wykonujesz 'd = Dinner.new (: date =>" 31/12/2012 ")' czy 'd.errors' pokazuje to samo" nie może być puste "? – berkes

+0

Dzięki za porady. '@ dinner' nigdy nie ma ustawionej daty, kiedy ją wylogowuję, ale jej wypróbowanie na konsoli działa dobrze. – LonelyWebCrawler

Odpowiedz

4

Znalazłem odpowiedź.

Moja kolumna date była typu date, a przed sprawdzeniem poprawności Railsy wykonały na niej .to_date. Niestety, użyty przeze mnie datepicker tworzy daty w amerykańskim formacie mm/dd/yy, którego Rails nie obsługuje, więc .to_date zwróciło zero. Dlatego data nie powiodła się sprawdzania poprawności: ponieważ była naprawdę zerowa, mimo że żądanie POST było w porządku.

Wybrałem proste rozwiązanie i zmieniłem domyślną datę datepaksu, jak pokazano here.

Uwaga: W mojej wersji datepicker, musiałem użyć format zamiast dateFormat, a także musiał użyć yyyy-mm-dd zamiast yy-mm-dd ponieważ Rails String#to_date uważa, że ​​rok „13” to dosłownie „0013”, a nie " 2013 ".

Powiązane problemy