2012-04-07 13 views
35

Próbuję zbudować wyjątkowo prostą aplikację szyn adresowych. Jednak otrzymuję ten błąd "Nie można masowo przypisać chronionych atrybutów: city_id". Jak mogę to naprawić? Prosimy o dodanie komentarza/sugestii do odpowiedzi na poniższy kod rails. Dzięki.Błąd szyn: Nie można przypisać masowo chronionych atrybutów.

Jak stworzyłem projekt (od podstaw):

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

zmienił tę linię <%= f.text_field :city %> z app/views/users/_form.html.erb do <%= f.collection_select :city_id, City.all, :id, :name %>

zmieniony user.rb automatycznie wygenerowana linia belongs_to :city do has_one :city.

belongs_to :city dodany do city.rb

P.S: Używam Rails 3.2.3 i Ruby 1.9.3.

Odpowiedz

64

Nie było ważnym szyny zmiana bezpieczeństwo 3.2.3, która wymaga, aby umożliwić masowe przypisanie jawnie ustawiając config.active_record.whitelist_attributes do 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

alternatywnie (i lepiej), nie pozwalając Przypisanie masy, wystarczy ustawić wartość attr_accessible dla atrybutów w modelu, które chcesz zmienić, np.

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

Proszę sprawdzić rails security guide więcej informacji na temat masowego przypisania w szynach.

+2

Otoczenie 'whitelist_attributes' true jest nowym standardem - że będzie wymagać, aby jawnie użyć attr_accessible. Jeśli chcesz powrócić do starego zachowania, powinieneś ustawić "whitelist_attributes" na false. –

+0

jak dodać attr_accessible, jeśli dodam model za pomocą 'ActiveRecord :: Schema.define' w schema.rb – pahnin

+1

Nie rób tego, szczera zamieć. Sprawdź https://github.com/rails/rails/issues/5228, aby uzyskać więcej informacji. –

3

czy można zmienić

config.active_record.mass_assignment_sanitizer = :strict 

do

config.active_record.mass_assignment_sanitizer = :logger 

Nie wiem dlaczego musiałem zmienić na :logger ale jest to rozwiązanie dla błędu.

+0

Wyjaśnienie mylące składnię: Ta linia 'config.active_record.mass_assignment_sanitizer =: strict' należy zmienić na tym ' config.active_record.mass_assignment_sanitizer =: logger' –

2

Wystarczy obejmują dataField w modelu jako:

attr_accessible :city_id 
Powiązane problemy