Ошибка Rails: невозможно назначить защищенные атрибуты
Я пытаюсь создать чрезвычайно простое приложение реселлеров AddressBook. Тем не менее, я получаю эту ошибку: "Невозможно назначить защищенные атрибуты: city_id". Как я могу это исправить? Пожалуйста, не стесняйтесь добавлять комментарии или предложения к вашему ответу относительно кода рельсов ниже. Спасибо.
Как я создал проект (с нуля):
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
изменил эту строку <%= f.text_field :city %>
от app/views/users/_form.html.erb
до <%= f.collection_select :city_id, City.all, :id, :name %>
изменено user.rb
автоматически сгенерированная строка belongs_to :city
до has_one :city
.
добавлено belongs_to :city
в city.rb
P.S: Я использую Rails 3.2.3 и Ruby 1.9.3.
Ответы
Ответ 1
Были важные рельсы изменения безопасности 3.2.3, которые требуют, чтобы вы разрешили массовое присвоение явно, установив config.active_record.whitelist_attributes
в 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
альтернативно (и лучше) вместо того, чтобы разрешать массовое осциллирование, вам просто нужно установить attr_accessible
для атрибутов в вашей модели, которые вы хотите изменить, например.
attr_accessible :city_id, :name # list all fields that you want to be accessible here
Пожалуйста, ознакомьтесь с руководством по безопасности рельсов для получения дополнительной информации о массовом назначении в рельсах.
Ответ 2
или вы можете изменить
config.active_record.mass_assignment_sanitizer = :strict
к
config.active_record.mass_assignment_sanitizer = :logger
Я не знаю, почему было изменено на :logger
, но это решение для ошибки.
Ответ 3
Просто укажите поле данных в модели как:
attr_accessible :city_id