2009-11-08 7 views
12

Mam więc metodę w modelu rezerwacji o nazwie add_equip. Ta metoda sprawdza, czy dodany element wyposażenia jest ważny (nie koliduje z inną rezerwacją).Szyny - Pobieranie komunikatu o błędzie z modelu, który nie jest błędem sprawdzania poprawności

Kontrola działa. Jeśli dodany ekwipunek nie powinien być dodany, to nie jest, a jeśli tak, powinien.

Problem polega na tym, że nie mogę określić sposobu wysłania wiadomości z powrotem do kontrolera, aby umieścić go w wiadomości flash? Wiem, że muszę czegoś tutaj przegapić, ale mam google przez kilka godzin i nie mogę znaleźć żadnych jasnych wyjaśnień, jak przekazywać błędy z powrotem do kontrolera, chyba że są to błędy sprawdzania poprawności.

add_equip w reservations_controller

def add_equip 
    @reservation = Reservation.find(params[:id]) 
    @addedEquip = Equip.find(params[:equip_id]) 

    respond_to do |format| 
    if @reservation.add_equip(@addedEquip) 
     flash[:notice] = "Equipment was added" 
     format.html { redirect_to(edit_reservation_path(@reservation)) } 
    else 
     flash[:notice] = @reservation.errors 
     format.html { redirect_to(edit_reservation_path(@reservation)) } 
    end 
    end 
    end 

add_equip w rezerwacji modelu

def add_equip equip 
    if self.reserved.find_by_equip_id(equip.id) 
    self.errors.add_to_base("Equipment Already Added") 
    return false 
    elsif !equip.is_available?(self.start, self.end) 
    self.errors.add_to_base("Equipment Already Reserved") 
    return false 
    else 
    r = Reserved.new 
    r.reservation = self 
    r.equip = equip 
    r.save 
    end 
    end 

Każda pomoc będzie mile widziana. Wiem, że tu brakuje czegoś podstawowego.

Odpowiedz

21

Zapisanie komunikatu o błędzie wydaje się być dla mnie w porządku, po prostu trzeba dowiedzieć się, jak go wprowadzić do widoku.

Jak o:

flash[:notice] = @reservation.errors.full_messages.to_sentence 

Zakładając masz zamiar ponownie wyświetla formularz, można również prawdopodobnie użyć:

<%= f.error_messages %> 

ewentualnie:

<%= error_messages_for :reservation %> 

także , możesz użyć flash [: error], możesz go inaczej pokolorować za pomocą klasy CSS w widoku.

+0

Dzięki dodaniu ".full_messages.Zrozumiałem, że muszę czegoś głupio przegapić – raytiley

+0

Używanie model.errors.full_messages w wiadomości flash jest IMHO złym sposobem na rozwiązanie tego problemu. 'error_messages_for: model' to konwencjonalny sposób wyświetlania komunikatów o błędach, Właściwym sposobem rozwiązania problemu byłoby umieszczenie błędu na equip_id zamiast na bazie, a następnie renderowanie akcji formularza edycyjnego Brak przekierowań potrzebne –

+0

To jest dobry punkt, lepiej byłoby ponownie renderować strona –

1

Myślę, że rozumiem, dlaczego błędy nie są przekazywane użytkownikowi.

Problem polega na wysyłaniu przekierowania do użytkownika, gdy operacja zakończy się niepowodzeniem, a nie tylko renderowaniem, co oznacza, że ​​utracisz wszystkie zmienne skonfigurowane do użycia w żądaniu. Zamiast dodawać błędy do lampy błyskowej, po prostu wyrenderuj stronę edycji i ustaw flash na normalny komunikat i wszystko powinno być w porządku.

Na przykład:

def add_equip 
    @reservation = Reservation.find(params[:id]) 
    @addedEquip = Equip.find(params[:equip_id]) 

    respond_to do |format| 
    if @reservation.add_equip(@addedEquip) 
     flash[:notice] = "Equipment was added" 
     format.html { redirect_to(edit_reservation_path(@reservation)) } 
    else 
     flash[:error] = 'Error adding equipment' 
     format.html { render :action => :edit } 
    end 
    end 
end 

Teraz można nadal używać zwykłych pomocników formularza do wyświetlania komunikatów o błędach.

Ponadto, tylko mała sugestia dotycząca kodu modelu, spróbuj użyć i18n, gdy to możliwe (w tym dla wiadomości flash w kontrolerze). Chociaż jest to przede wszystkim osobiste preferencje, daje logiczne miejsce do domu dla wszystkich wiadomości i określonego tekstu, a alos pozwala tworzyć ogólne lub domyślne komunikaty, które można zmienić w jednym miejscu zamiast duplikowania zmiany w wielu modelach i kontrolerach.

np.

def add_equip equip 
    if self.reserved.find_by_equip_id(equip.id) 
    self.errors.add_to_base(:already_added) 
    return false 
    elsif !equip.is_available?(self.start, self.end) 
    self.errors.add_to_base(:already_reserved) 
    return false 
    else 
    r = Reserved.new 
    r.reservation = self 
    r.equip = equip 
    r.save 
    end 
end 
+0

Dzięki za odpowiedź. Pierwszy post rozwiązał problem bez zmiany kodu przekierowania. Sugestia i18n jest jednak dobrym pomysłem. Dzięki. – raytiley

+0

Zdecydowanie zaleca zmianę kodu, aby wykonać mój przykład. Pierwszy przykład nie jest zgodny ze standardową konwencją dotyczącą wyświetlania błędów i chociaż nie jest to złe samo w sobie, problem nie jest nowy i standardowy sposób radzenia sobie z tym przepływem pracy jest już ustalony. Postępując zgodnie z konwencją, inni programiści będą mogli szybciej zrozumieć Twój kod bez konieczności wymyślania niestandardowego przepływu pracy lub wyświetlania komunikatów o błędach. –

Powiązane problemy