为什么attr_accessor揍在这种模式在Ruby on Rails的现有的变量?(Why do

2019-07-18 14:11发布

我被这最近咬伤,并且它会是确切地知道发生了什么事要做到这一点非常有用,这样其他人避免这个错误。

我有一个模型的用户,有像这样的模式:

create_table "users", :force => true do |t|
    t.string   "user_name"
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "location"
    t.string   "town"
    t.string   "country"
    t.string   "postcode"
    t.boolean  "newsletter"

在类user.rb,我有三种方法attr_accessor:

class User < ActiveRecord::Base

# lots of code

  attr_protected :admin, :active

# relevant accessor methods

  attr_accessor :town, :postcode, :country 

end

现在,在我的用户控制,如果我有以下方法:

def create
    @user = User.new params[:user]
end

当我尝试创建内容的新用户在此PARAMS哈希:

  --- !map:HashWithIndifferentAccess 
  # other values
  country: United Kingdom
  dob(1i): "1985"
  dob(2i): "9"
  dob(3i): "19"
  town: london

返回的对象为空字符串countrytown和邮政编码postcode值,就像这样。

(rdb:53) y user1
--- !ruby/object:User 
attributes: 
  # lots of attributes that aren't relevant for this example, and are filled in okay
  postcode: 
  country: 
  town: 

我可以告诉大家,attr_accessor中方法重挫活动记录现有的存取方法,因为当我带他们出去一切工作正常,因此该解决方案是相当简单 - 只是带他们出去。

究竟什么是发生在这里?

我期待在这里的活动记录Rails的API文档 ,并在这里Ruby的自己对文档attr_accessor ,但我仍然略显朦胧如何attr_accessor这里摔东西。

任何能够提供一些线索,制止这种其他一些可怜的灵魂下跌犯规?

Answer 1:

当您添加一个attr_accessor一类,它定义上有两个方法,例如用户#邮政编码和用户#邮政编码=。

如果访问者的名字等于一个模型属性的名称,打破东西(如果你不小心)。 当您指定属性的模型,用户#邮政编码=被调用,并在你的情况下,它什么都不做,除了

@postcode = value

所以,价值只被存储在一个实例变量并没有出现在属性哈希值。

而在正常情况下(没有访问),这会去的method_missing并最终引发类似

write_attribute(:postcode, value)

然后它会出现在你的模型的属性。 希望是有道理的。



Answer 2:

为什么在第一个地方,你正在使用attr_accessor :town, :postcode, :country ? 活动记录对你的setter / getter方法。 刚落,那行,事情应该工作。



Answer 3:

你可能想使用attr_accessible上ActiveRecord的模型,使属性的质量分配。 你不需要attr_accessor为getter / setter方法已经被定义为模型属性。



文章来源: Why does attr_accessor clobber the existing variables in this model in Ruby on Rails?