2012-04-07 7 views
35

Estoy intentando crear una aplicación de rieles de libreta de direcciones extremadamente simple. Sin embargo, recibo este error "No se puede asignar en masa los atributos protegidos: city_id". ¿Cómo puedo arreglar esto? Por favor, siéntase libre de agregar cualquier comentario/sugerencia a su respuesta con respecto al código de rieles a continuación. Gracias.Error de rieles: no se pueden asignar en masa los atributos protegidos

Cómo creé el proyecto (desde cero):

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: semillas

cambió esta línea <%= f.text_field :city %>app/views/users/_form.html.erb-<%= f.collection_select :city_id, City.all, :id, :name %>

changed user.rb línea autogenerada belongs_to :city a has_one :city.

añade belongs_to :city-city.rb

P.S: Estoy usando Rails 3.2.3 y 1.9.3 de Ruby.

Respuesta

64

No fue un importante cambio de rieles de seguridad 3.2.3 que requiere que permiten la asignación de masas explícitamente mediante el establecimiento de 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 (y mejor), en lugar de permitir Asignación masiva, solo tiene que configurar el attr_accessible para los atributos en su modelo que desea poder cambiar, por ejemplo

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

Por favor, compruebe el rails security guide para obtener más información acerca de la masa-asignación en los carriles.

+2

Ajuste 'whitelist_attributes' a verdadero es el nuevo valor predeterminado - que requieren el uso de attr_accessible explícitamente. Si desea volver al comportamiento anterior, debe establecer 'whitelist_attributes' en falso. –

+0

cómo agregar attr_accessible si agrego un modelo usando 'ActiveRecord :: Schema.define' en schema.rb – pahnin

+1

No haga esto, frank blizzard. Consulte https://github.com/rails/rails/issues/5228 para obtener más información. –

3

o puede cambiar

config.active_record.mass_assignment_sanitizer = :strict 

a

config.active_record.mass_assignment_sanitizer = :logger 

No sé por qué tenía que cambiar para :logger pero esta es la solución para el error.

+0

Aclaración de confuso sintaxis: Esta línea 'config.active_record.mass_assignment_sanitizer =: strict' debe ser cambiado para este ' config.active_record.mass_assignment_sanitizer =: logger' –

2

basta con incluir el campo de datos en el modelo como:

attr_accessible :city_id 
Cuestiones relacionadas