2013-07-19 10 views
5

Scusate se il titolo è un po 'confuso. Ho un modulo per un Item con il campo name. C'è un campo di testo in cui l'utente può inserire un nome e inviarlo. Ma se l'utente non digita nulla e non fa clic su Invia, Rails mi dà un errore param not found: item e non sono sicuro su chi aggirare questo problema.Rails 4: Come gestisco un modulo inviato dove non è stato selezionato nulla?

items_controller.rb

def new 
    @item = Item.new() 

    respond_to do |format| 
    format.html 
    format.json { render json: @item } 
    end 
end 

def create 
    @item = Item.new(item_params) 

    respond_to do |format| 
    if @item.save 
     format.html { redirect_to items_path } 
     format.json { render json: @item, status: :created, location: @item } 
    else 
     format.html { render action: 'new', :notice => "Input a name." } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
    end 
    end 
end 

private 

def item_params 
    params.require(:item).permit(:name) 
end 

app/views/oggetti/new.html.haml

= form_for @item do |f| 
    = f.label :name 
    = f.text_field :name 
    = f.submit "Submit" 

Il params.require (: articolo) parte è quello che causa l'errore. Quale convenzione per gestire l'errore quando params [: item] non è presente?

+0

non si dovrebbe ottenere questo errore, quali sono i parametri pubblicati quando si vede il registro? –

risposta

7

È in ritardo per una risposta, ma continuerò a scriverlo per qualcun altro. Come indicato in rails guides, è necessario utilizzare fetch anziché richiedere in parametri forti, utilizzando fetch è possibile fornire un valore predefinito se non viene passato nulla come input.Qualcosa del tipo:

params.fetch(:resource, {}) 
1

Aggiornamento:

ponteggi rails4 app: https://github.com/szines/item_17751377

Funziona se un utente a mantenere campo del nome vuoto quando creare un nuovo elemento ...

Sguardi, funziona senza problemi. ..

Development.log indica che i parametri sarebbero i seguenti se l'utente mantiene un campo vuoto:

"item"=>{"name"=>""} 

C'è sempre qualcosa nel hash ...

Come Mike Li già menzionato in un commento, qualcosa che non va ... perché non dovrebbe essere vuoto questo params [: elemento] ...

È possibile verificare se qualcosa di nullo, con .nil?, in questo caso params[:item].nil? sarà true se è nil. O puoi usare .present? come già scrivevano gli sytycs.

risposta precedente:

Se si dispone di situazione in cui: l'articolo è vuoto, si deve solo usare params [:] elemento senza richiedere.

def item_params 
    params[:item].permit(:name) 
end 

Maggiori informazioni su richiedono nel codice sorgente strong_parameters.rb:

# Ensures that a parameter is present. If it's present, returns 
# the parameter at the given +key+, otherwise raises an 
# <tt>ActionController::ParameterMissing</tt> error. 
# 
# ActionController::Parameters.new(person: { name: 'Francesco' }).require(:person) 
# # => {"name"=>"Francesco"} 
# 
# ActionController::Parameters.new(person: nil).require(:person) 
# # => ActionController::ParameterMissing: param not found: person 
# 
# ActionController::Parameters.new(person: {}).require(:person) 
# # => ActionController::ParameterMissing: param not found: person 
def require(key) 
    self[key].presence || raise(ParameterMissing.new(key)) 
end 
+0

Questo mi sta dando un errore '' permesso 'per nil: NilClass'. Cosa faccio se params [: item] non è solo vuoto, ma è anch'esso zero? – justindao

+0

Ho impalcato un'app per capire quale potrebbe essere il tuo problema. Puoi trovarlo qui: https://github.com/szines/item_17751377 – Zoltan

0

Io personalmente non ho passato a parametri forti, quindi non sono sicuro di come si dovrebbe gestire qualcosa come:

params.require(:item).permit(:name) 

ma è sempre possibile verificare la presenza di elementi con qualcosa del tipo:

if params[:item].present? 
    … 
end 
Problemi correlati