2012-04-07 12 views
35

Sto provando a creare un'applicazione di rotaie AddressBook estremamente semplice. Tuttavia, sto ricevendo questo errore "Impossibile assegnare in massa attributi protetti: city_id". Come posso risolvere questo? Sentiti libero di aggiungere commenti/suggerimenti alla tua risposta riguardo al codice dei binari qui sotto. Grazie.Rails: impossibile assegnare in massa attributi protetti

Come ho creato il progetto (da zero):

rails new demo 
rails generate model City name:string 
rails generate scaffold User name:string city:references 
rake db:migrate 

db/seeds.db:

City.create(name: "City1") 
City.create(name: "City2") 
City.create(name: "City3") 

rake db: seed

cambiato questa linea <%= f.text_field :city %>app/views/users/_form.html.erb-<%= f.collection_select :city_id, City.all, :id, :name %>

modificato user.rb linea generata automaticamente belongs_to :city a has_one :city.

aggiunto belongs_to :city-city.rb

P.S: Sto usando Rails 3.2.3 e 1.9.3 di Ruby.

risposta

64

Ci fu un importante cambiamento rotaie di sicurezza 3.2.3, che richiede di consentire l'assegnazione di massa esplicitamente impostando config.active_record.whitelist_attributes a false

http://weblog.rubyonrails.org/2012/3/30/ann-rails-3-2-3-has-been-released/

http://www.h-online.com/security/news/item/Rails-3-2-3-makes-mass-assignment-change-1498547.html

alternativamente (e meglio), invece di permettere messa di massa, basta impostare lo attr_accessible per gli attributi nel modello che si desidera poter modificare, ad es.

attr_accessible :city_id, :name # list all fields that you want to be accessible here 

Si prega di verificare la rails security guide per ulteriori informazioni sui mass-assegnazione a rotaie.

+2

impostazione 'whitelist_attributes' al vero è il nuovo default - che si richiede all'utente di utilizzare in modo esplicito attr_accessible. Se vuoi ripristinare il vecchio comportamento, devi impostare 'whitelist_attributes' su false. –

+0

come aggiungere attr_accessible se sto aggiungendo un modello usando 'ActiveRecord :: Schema.define' in schema.rb – pahnin

+1

Non farlo, sincera tormenta. Controllare https://github.com/rails/rails/issues/5228 per ulteriori informazioni. –

3

o si può cambiare

config.active_record.mass_assignment_sanitizer = :strict 

a

config.active_record.mass_assignment_sanitizer = :logger 

non so il motivo per cui hanno dovuto cambiato in :logger, ma questa è la soluzione per l'errore.

+0

Chiarimento della sintassi di confusione: Questa linea 'config.active_record.mass_assignment_sanitizer =: strict' deve essere modificato in questo ' config.active_record.mass_assignment_sanitizer =: logger' –

2

sufficiente includere il DataField nel modello come:

attr_accessible :city_id 
Problemi correlati