2012-12-13 10 views
14

This video afferma che è possibile proteggere l'ingresso in arrivo tramite il controller, ma è ancora possibile eseguire l'assegnazione di massa tramite modelli e specifiche. Tuttavia, non ho visto questo documentato come una caratteristica quando si utilizza strong_parameters in 3.2.8.Strong Parameters in Rails 3.2.8

Capisco che ho bisogno di mescolare in ActiveModel::ForbiddenAttributesProtection nei miei modelli e impostare config.active_record.whitelist_attributes = false in config/application.rb. Ho anche estratto tutte le mie chiamate attr_accessible dal modello.

Con o senza il mixin, sto ricevendo errori di assegnazione di massa.

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: home_phone, cell_phone

mi sto perdendo qualcosa?

+2

Se si esegue "attr_protected: home_phone,: cell_phone", non sarà possibile assegnare la massa. – VenkatK

+1

Sfortunatamente, non ho nemmeno "attr_protected" nel mio modello. Ma sto ricevendo lo stesso errore. –

+0

@ brandon-hansen - hai visto railscast di Ryan Bates su questo argomento? http://railscasts.com/episodes/371-strong-parameters?view=asciicast – simonmorley

risposta

19

Il suggerito RailsCast è probabilmente un buon inizio, ma qui è un riassunto di quello che hai da fare in Rails3.x per ottenere i parametri di forza di lavoro, invece di attr_accessible:

  1. Aggiungi gem 'strong_parameters' al vostro Gemfile e eseguire il pacchetto.

  2. come commento (o impostato su false) config.active_record.whitelist_attributes = true in config/application.rb

  3. Mix nel ActiveModel::ForbiddenAttributesProtection nel modello (Il Railscast propone di fare questo in una nuova inizializzazione, config/initializers/strong_parameters. RB ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection))

  4. da ora in poi si dovrà utilizzare una sintassi di questo tipo:

    model_params = params[:model].permit(:attribute, :another_attribute) 
    @model.update_attributes(model_params) 
    

    quando si aggiornano i modelli. In questo caso, qualsiasi attributo in params[:model] eccetto :attribute e :another_attribute causerà un errore ActiveModel :: ForbiddenAttributes.

È anche possibile utilizzare il resto della nuova magia da ActionController::Parameters, come ad esempio .require(:attribute) per imporre la presenza di un attributo.

+0

Funziona ancora, questo dovrebbe essere accettato –

2

Non è lo stesso del tuo problema, ma potrebbe capitare a qualcun altro di ricevere MassAssignmentSecurity :: Error. Ho riscontrato un problema in cui gli attributi 'id' e 'tipo' sembrano essere protetti di default anche quando avevo preso i passaggi prescritti per passare all'utilizzo di parametri forti piuttosto che protezione di assegnazione di massa. Avevo un'associazione chiamata 'type' che ho rinominato in 'project_type' per risolvere il problema (l'attributo era già project_type_id).

+0

L'uso di 'type' per attributi o relazioni è una cattiva idea poiché Rails lo usa per tenere traccia delle relazioni STI.Quindi è più o meno un attributo riservato :) Inoltre 'id' è il parametro predefinito che viene impostato in un numero di casi dal router in modo che possa essere anche precario. –

+0

@ d-Pixie Fair abbastanza ma gli errori che ho ottenuto non erano davvero utili e molto confusi. Un errore che diceva di non usare quelli andava bene, un errore di MassAssignmentSecurity :: quando l'intero sistema doveva essere disabilitato era molto confuso. tipo è stato quello che ho colpito e ho trovato id è stato influenzato anche quando ho scavato nel codice sorgente. –

+0

Ranato allo stesso problema, l'errore non è descrittivo. Usa 'self.inheritance_column = nil' per correggere se non stai usando STI. – toxaq

Problemi correlati