2012-04-07 25 views
35

Tôi đang cố gắng xây dựng một ứng dụng đường ray AddressBook cực kỳ đơn giản. Tuy nhiên, tôi nhận được lỗi này "Không thể gán khối lượng thuộc tính được bảo vệ: city_id". Làm thế nào tôi có thể sửa lỗi này? Vui lòng thêm bất kỳ nhận xét/đề xuất nào vào câu trả lời của bạn về mã đường ray bên dưới. Cảm ơn.Lỗi đường ray: Không thể chỉ định khối lượng thuộc tính được bảo vệ

Làm thế nào tôi tạo ra các dự án (từ đầu):

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: hạt giống

thay đổi dòng này <%= f.text_field :city %>app/views/users/_form.html.erb-<%= f.collection_select :city_id, City.all, :id, :name %>

thay đổi user.rb dòng được tạo tự động belongs_to :city đến has_one :city.

thêm belongs_to :city-city.rb

Tái bút: Tôi đang sử dụng Rails 3.2.3 và Ruby 1.9.3.

Trả lời

64

Có một quan trọng ray thay đổi an ninh 3.2.3 mà đòi hỏi bạn phải cho phép chuyển nhượng hàng loạt explicitely bằng cách thiết lập 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

cách khác (và tốt hơn), thay vì cho phép xác nhận khối lượng, bạn chỉ cần thiết lập các attr_accessible cho các thuộc tính trong mô hình của bạn mà bạn muốn để có thể thay đổi, ví dụ

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

Vui lòng kiểm tra rails security guide để biết thêm thông tin về chuyển nhượng hàng loạt trong đường ray.

+2

Setting 'whitelist_attributes' true là mặc định mới - mà sẽ yêu cầu bạn phải sử dụng một cách rõ ràng attr_accessible. Nếu bạn muốn hoàn nguyên về hành vi cũ, bạn nên đặt 'whitelist_attributes' thành false. –

+0

làm thế nào để thêm attr_accessible nếu tôi đang thêm một mô hình bằng cách sử dụng 'ActiveRecord :: Schema.define' trong schema.rb – pahnin

+1

Đừng làm điều này, frank blankard. Kiểm tra https://github.com/rails/rails/issues/5228 để biết thêm thông tin. –

3

hoặc bạn có thể thay đổi

config.active_record.mass_assignment_sanitizer = :strict 

để

config.active_record.mass_assignment_sanitizer = :logger 

Tôi không biết tại sao phải thay đổi để :logger nhưng đây là giải pháp cho các lỗi.

+0

Làm rõ cú pháp khó hiểu: Dòng này 'config.active_record.mass_assignment_sanitizer =: strict' nên được thay đổi này ' config.active_record.mass_assignment_sanitizer =: logger' –

2

Chỉ cần bao gồm các DataField trong mô hình như:

attr_accessible :city_id 
Các vấn đề liên quan