2009-11-08 16 views
12

Quindi ho un metodo in un modello di prenotazione chiamato add_equip. Questo metodo esegue alcuni controlli per assicurarsi che il pezzo aggiunto di equipaggiamento sia valido (non in conflitto con un'altra prenotazione).Rails - Ottenere un messaggio di errore dal modello che non è un errore di convalida

Gli assegni funzionano. Se un pezzo aggiuntivo di equipaggiamento non deve essere aggiunto, non lo è, e se lo fosse dovrebbe.

Il problema è che non riesco a capire come inviare i messaggi al controller da inserire nel messaggio flash? So che mi manca qualcosa qui, ma ho cercato su Google per un paio d'ore e non riesco davvero a trovare spiegazioni chiare su come passare gli errori sul controller, a meno che non siano errori di validazione.

add_equip in 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 in riserva modello

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 

Qualsiasi aiuto sarebbe molto apprezzato. So che mi manca qualcosa di base qui.

risposta

21

L'utilizzo di add_to_base per memorizzare il messaggio di errore mi sembra soddisfacente, è sufficiente capire come ottenerlo nella vista.

ne dite:

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

Supponendo che si sta andando a ri-visualizzare un form, si potrebbe anche probabilmente usare:

<%= f.error_messages %> 

O forse:

<%= error_messages_for :reservation %> 

anche , potresti voler usare il flash [: errore], quindi puoi colorarlo in modo diverso con una classe CSS nella tua vista.

+0

Grazie di aver aggiunto ".full_messages.to_sentance "ha fatto il trucco, sapevo che mi mancava qualcosa di stupido – raytiley

+0

L'uso di model.errors.full_messages in un messaggio flash IMHO è un modo scadente per risolvere questo problema. 'error_messages_for: model' è il modo convenzionale per visualizzare i messaggi di errore, come il modo corretto per risolvere il problema sarebbe quello di inserire l'errore su equip_id invece che su base e quindi semplicemente eseguire l'azione del modulo di modifica. Non sono necessari reindirizzamenti –

+0

Questo è un buon punto, sarebbe meglio effettuare nuovamente il rendering la pagina –

1

Penso di poter vedere perché gli errori non vengono restituiti all'utente.

Il problema è che si sta inviando un reindirizzamento all'utente quando l'azione ha esito negativo invece di eseguire semplicemente un rendering, il che significa che si perdono le variabili impostate da utilizzare all'interno della richiesta. Invece di aggiungere errori al flash, basta eseguire il rendering della pagina di modifica e impostare il flash su un messaggio normale e tutto dovrebbe andare bene.

Ad esempio:

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 

Ora è possibile continuare a utilizzare le normali helper delle form per la visualizzazione dei messaggi di errore.

Inoltre, solo un piccolo suggerimento per il codice modello, provare a utilizzare i18n quando possibile (inclusi i messaggi flash nel controller). Sebbene si tratti principalmente di una preferenza personale, fornisce una sede logica a tutti i messaggi e al testo specifico e consente di creare messaggi generali o predefiniti che possono essere modificati in un unico posto anziché duplicare le modifiche in più modelli e controller.

es.

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

Grazie per la risposta. Il primo post ha risolto il problema senza modificare il codice di reindirizzamento. Il suggerimento i18n è comunque una buona idea. Grazie. – raytiley

+0

Consiglio vivamente di cambiare il codice per seguire il mio esempio. Il primo esempio non segue la convenzione standard per la visualizzazione degli errori, e sebbene questo non sia di per sé un aspetto negativo, il tuo problema non è nuovo e un metodo standard per gestire questo flusso di lavoro è già stato stabilito. Seguendo le convenzioni, altri sviluppatori saranno in grado di comprendere il codice più rapidamente senza dover calcolare il flusso di lavoro personalizzato o il modo in cui visualizzare i messaggi di errore. –

Problemi correlati