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

nun*_*nos 38 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
Run Code Online (Sandbox Code Playgroud)

DB/seeds.db:

City.create(name: "City1")
City.create(name: "City2")
City.create(name: "City3")
Run Code Online (Sandbox Code Playgroud)

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 :cityhas_one :city.

添加belongs_to :citycity.rb

PS:我使用的是Rails 3.2.3和Ruby 1.9.3.

tma*_*ini 68

有一个重要的安全更改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
Run Code Online (Sandbox Code Playgroud)

有关轨道中质量分配的更多信息,请查看rails安全指南.

  • 如果有一件事我对rails有所了解,那就是他们有合理的默认值.我会确保在更改默认值之前研究这个. (6认同)
  • 将`whitelist_attributes`设置为true是新的默认值 - 这将要求您明确使用attr_accessible.如果要恢复旧行为,则应将`whitelist_attributes`设置为false. (2认同)