我正在尝试构建一个非常简单的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。
答案 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