2013-06-27 20 views
17

Modelli: messaggi e UtentiRails 4 Strong Parametri - Manutenzione mancante Modello Parametri Hash

Messaggio belongs_to: utente
has_many utente: messaggi

semplice.

Supponendo che alcuni utenti esistano, visitiamo la pagina di modifica per un post.

<%= form_for @post do |f| %> 

...

<% User.all.each do |user| %> 
    <div><%= f.radio_button "user_id", user.id %></div> 
<% end %> 

...

controller del Messaggio sfrutta Rails 4 parametri forti.

params.require(:post).permit(:user_id) 

assumere la forma dopo modifica ha solo i pulsanti di opzione come campi.

Problema: Viene generata l'eccezione ActionController :: ParameterMissing. param non trovato: post

Il motivo dell'hac post param non viene mai creato, causando l'eccezione di cui sopra. I pulsanti di opzione vuoti, a differenza dei campi di testo vuoti, ad esempio, non attivano la creazione dell'hash param del modello.

Cosa succede se il modello Post richiede un ID utente valido? Certamente si vorrebbe rendere di nuovo la vista con il motivo per cui il Post non può essere salvato.

Domanda: Qual è un modo elegante per gestire questa situazione rispettando la convenzione di Rails?

UPDATE:

brainstorming su questo ulteriore, sono sicuro che ci sono probabilmente molte altre situazioni che generano questo problema; non corrisponde necessariamente ai pulsanti di opzione.

+0

Ho un problema ancora più strano ...Ottengo lo stesso parametro non trovato per l'hash del modello, ma quello che sto testando è un form_for @user con due campi dell'utente e basta. il mio url capita di usare username e penserei che mancasse id o qualcosa del genere. ma ho un'altra parte del mio progetto che fa la stessa cosa. l'unica differenza è che ho creato questo modulo da zero piuttosto che attraverso l'impalcatura ... – dtc

risposta

28

Ho un problema simile e non mi è piaciuta molto nessuna di queste risposte. Nella documentazione rotaie (http://guides.rubyonrails.org/action_controller_overview.html#more-examples) Vedo la seguente soluzione:

params.fetch(:blog, {}).permit(:title, :author) 

Effettivamente si stanno fornendo un valore predefinito di {}, che sembra funzionare abbastanza bene (almeno per la mia situazione).

Applicando al codice, dovreste:

params.fetch(:post, {}).permit(:user_id) 

Credo che questo sia ragionevolmente pulito, e sembra funzionare nel mio codice.

+1

Impressionante! Questa era la soluzione che stavo cercando da sempre. – Ben

+0

Grazie PaulL. Mi hai salvato la vita. Ho anche provato ad usare la soluzione di Ben ma mi dà questo errore: quando assegni gli attributi, devi passare un hash come argomento. – cyonder

4

Questa era la mia soluzione immediata ... anche se mi sembra un po 'sciocco, perché dovresti controllare i parametri del post se sei chiaramente nel post controller e li richiedi comunque. Sembra molto controintuitivo. È davvero il modo migliore?

params.require(:post).permit(:user_id) if params[:post] 
+0

sì questo funziona ma non capisco perché –

+2

@ConnorLeech funziona perché il problema originale era params [: post] non viene creato, e il se semplicemente verifica quello prima di eseguire i metodi forti params. Se i parametri non esistono affatto, il metodo restituisce semplicemente zero. Nil funziona in molti, se non tutti i metodi di aggiornamento del modello, quindi tutto funziona. Non mi piace molto perché si suppone che venga lanciata un'eccezione se i post param non esistono (uno dei punti interi di parametri forti). Nulla di ciò che accade non è quello che considererei il comportamento previsto. – Ben

+0

Dovrà controllare i parametri [: post] anche nel controller per procedere ulteriormente al valore params [: post] [: user_id] –

Problemi correlati