为什么在Rails 3.2.3中没有大量赋值:id引发错误?

时间:2012-07-11 15:39:54

标签: ruby-on-rails-3

看来update_attributes不允许我更改id(因此它受到保护),但为什么rails不会抛出与其他受保护属性相同的错误?

> 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

这是rails生成的模型(app / models / user.rb):

class User < ActiveRecord::Base
  attr_accessible :name
end

1 个答案:

答案 0 :(得分: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)

另外,请不要这样做。 :)这将使您的代码难以维护......