Rails错误:无法批量分配受保护的属性

时间:2012-04-07 00:55:44

标签: ruby-on-rails

我正在尝试构建一个非常简单的AddressBook rails应用程序。但是,我收到此错误“无法批量分配受保护的属性:city_id”。我怎样才能解决这个问题?请随时在下面的rails代码中添加任何评论/建议。感谢。

我如何创建项目(从头开始):

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。

3 个答案:

答案 0 :(得分:66)

有一个重要的安全更改rails 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

请查看rails security guide以获取有关铁轨中质量分配的更多信息。

答案 1 :(得分:3)

或者你可以改变

config.active_record.mass_assignment_sanitizer = :strict 

config.active_record.mass_assignment_sanitizer = :logger 

我不知道为什么必须更改为:logger,但这是错误的解决方案。

答案 2 :(得分:2)

只需将数据字段包含在模型中:

attr_accessible :city_id