2

update_attributesでは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

これは、railsが生成するモデル(app / models / user.rb)です。

class User < ActiveRecord::Base
  attr_accessible :name
end
4

1 に答える 1

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)

また、これを行わないでください。:)それはあなたのコードを維持するのを難しくします...

于 2012-07-16T15:31:38.973 に答える