2013-07-12 14 views
5

sulla mia azione di modifica Non aumento mai il record non trovato se il record non esiste. Quello che sto facendo è sbagliatoRails 4.0 record non trovato

Ecco la mia modifica azione

class OffersController < ApplicationController 

    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found   

    def show 
     @offer = Offer.find(params[:id]) 
    end   

    def edit 
     @offer = Offer.find_by(edit_hash: params[:edit_hash]) 
     @country = Country.find_by(name: @offer.country) 
     @states = State.find(:all, :conditions => { country_id: @country }) 
    end 

    private 

     def record_not_found 
      render text: "404 Not Found", status: 404 
     end 
    end 

Ho sempre trovato metodo non definito `paese' per nil: NilClass per il mio Unexist Modifica record.

Inoltre, aggiungo il record non trovato nella mia azione show, ma vorrei usare la pagina 404.html che ho nella mia cartella pubblica. Come posso usare questo file ???

Grazie in anticipo

+0

Hai eseguito 'rake db: migrate' dalla console per popolare il tuo database? –

risposta

12

Il problema è che la linea @offer = Offer.find_by(edit_hash: params[:edit_hash]) non risponde con ActiveRecord::RecordNotFound. Sta rispondendo con nil.

Potete vedere questo aprendo la console di Rails dalla directory della vostra app con rails c. Nella console, mettere questo in:

@offer = Offer.find_by(edit_hash: params[:edit_hash])

Vedrete che la sua uscita è => nil. È quindi possibile digitare @offer e verrà visualizzato il suo output, di nuovo, è => nil. Ora, mettere questa riga nella console:

@offer = Offer.find(99999)

Vedrete che la sua uscita è ActiveRecord::RecordNotFound: Couldn't find Offer with id=99999.

per risolvere il problema, aggiungere ! ai vostri find_by chiamate, in modo che siano in questo modo:

@offer = Offer.find_by!(edit_hash: params[:edit_hash])

Questo farà sì che Rails a rispondere con ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound invece di nil.

+0

Grazie James apprezzo molto il tuo aiuto – Jean

+1

Ho appena eseguito lo stesso problema, dal momento che avevo bisogno di cambiare il finder da '.find' a' .find_by_username', hmmm, '.find' restituisce un'eccezione RecordNotFound, ma' .find_by_ ... 'no – Flov

+0

Esatto. [find] (http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find) genererà 'ActiveRecord :: RecordNotFound' se uno o più ID non vengono trovati, e [find_by] (http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by) restituirà 'nil' se non viene trovato alcun record. –

Problemi correlati