2013-05-13 15 views
56

In Rails 3, è stato possibile inserire un attributo in params in questo modo:Rails 4: Inserire Attributo Into Parametri

params[:post][:user_id] = current_user.id 

sto cercando di fare qualcosa di simile in Rails 4, ma che non hanno la fortuna:

post_params[:user_id] = current_user.id 

. . . . 


private 

    def post_params 
    params.require(:post).permit(:user_id) 
    end 

Rails ignora questo inserimento. Non commette errori, fallisce tranquillamente.

risposta

115

Trovato la risposta here. Anziché inserire l'attributo dall'azione del controller, è possibile inserirlo nella definizione params con un'unione. Di estendere il mio esempio precedente:

private 

    def post_params 
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id) 
    end 
+3

Grazie, avevo bisogno di usare deep_merge, perché i miei attributi sono annidati ... – stephenmurdoch

+0

@marflar hai usato 'deep_merge' nel costruttore params? O altrove nel controller? –

+0

Questo è come lo faccio anche io ma continuo a pensare che ci debba essere un modo per ASCIUGARCI un po '. Tutti i miei 50+ controller hanno un'istruzione .merge simile nella zona strict params. Nel mio caso unisco current_user in update_by. Unisco current_user in created_by solo nel metodo create. – Dan

27

Oltre alla risposta di @ timothycommoner, in alternativa è possibile eseguire la stampa su una base per-action:

def create 
    @post = Post.new(post_params.merge(user_id: current_user.id)) 
    # save the object etc 
    end 

private 
    def post_params 
    params.require(:post).permit(:some_attribute) 
    end 
+1

Ehi, come lo faresti per un nidificato risorsa? – Patient55

+0

Non so perché, ma la risposta di @ timothycommoner non funziona per me. solo questo ... ho anche provato a "unire!" e questo ancora non è riuscito. oh beh, questo è più facile in ogni caso perché non c'è scavare in metodi privati ​​ed è più facile cambiare in diversi casi d'uso – james

+0

@ Patient55 Immagino che tu abbia bisogno di 'deep_merge' come discusso nei commenti della risposta selezionata. – Wit

0

In alternativa per questo caso, è possibile attributo passaggio richiesto via scope:

current_user.posts.create(post_params)

Problemi correlati