2012-07-11 44 views
2

看來,update_attributes不允許我改變id(所以它是受保護的),但爲什麼rails沒有爲其他受保護的屬性拋出相同的錯誤呢?爲什麼在Rails 3.2.3中沒有大量賦值:id會引發錯誤?

> rails new mass_assignment_test 
> cd mass_assignment_test 
> rails g model User name:string 
> rake db:migrate 
> rails console 
>> u = User.create(:name => "ben") 
>> u.update_attributes(:id => 5) 
=> true 
>> u.id 
=> 1 
>> u.update_attributes(:created_at => Time.now) 
ActiveModel::MassAssignmentSecurity:Error 

這是軌道模型生成(應用程序/模型/ user.rb):

class User < ActiveRecord::Base 
    attr_accessible :name 
end 
+0

你能告訴我們你的模型中的代碼或者是在運行生成器後直接測試嗎? – BrMcMullin 2012-07-11 17:38:26

+0

測試是在運行生成器後直接進行的,但爲了清晰起見,我將生成的模型添加到問題中。 – 2012-07-11 17:43:12

回答

2

記錄的ID是Rails的自身保護:

# activerecord-3.1.3/lib/active_record/base.rb:1961 
def self.attributes_protected_by_default 
    default = [ primary_key, inheritance_column ] 
    default << 'id' unless primary_key.eql? 'id' 
    default 
end 

你可以繞過這個:

u.update_attributes!({:id => 5}, :without_protection => true) 

另外,請求請不要這樣做。 :)它會使你的代碼很難維護...

+0

對,絕對不是應該進入生產代碼的東西。這是來自測試套件中的一個邊緣案例,與我預期的行爲不同。 – 2012-07-18 03:29:00

相關問題