我真的对 Rails 3.2 中的虚拟属性感到困惑,我所有的研究都无助于让事情变得更清晰。
# input model
class Input < ActiveRecord::Base
# Attributes --------------------
attr_accessible :title, :parent
attr_accessor :parent
def parent=(id)
wrtite_attribute(:parent, id.to_i)
self.parent = id.to_i
self[:parent] = id.to_i
@parent = id.to_i # seems to be the only one working. Why?
end
end
# inputs controller
class InputsController < ApplicationController
def new
@input = Input.new({
start_date: @current_scope_company.creation_date,
parent: 'bla'
})
@input.parent = 'bla'
@input[;parent] = 'bla'
end
end
# inputs table
create_table "inputs", :force => true do |t|
t.string "title"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
以上,我已经编译了我在互联网上找到的几乎所有替代品。这不是我运行的代码,只是同一事物的几个版本。虽然,无论我尝试什么,我都会收到以下警告:
DEPRECATION WARNING: You're trying to create an attribute 'parent'. Writing arbitrary attributes on a model is deprecated. Please just use 'attr_writer' etc.
有时,我什至得到一个stack level too deep
. 我很想了解属性是如何工作的。
1/attr_accessor
是attr_writer
加attr_reader
对吗?为什么要求我attr_writer
在警告中使用?
2/ 我应该如何从模型中写入属性(以及为什么)
3/ 我应该如何从控制器中写入属性(以及为什么)
非常感谢!
更新
经过进一步测试,看起来正确的方法是@parent = id.to_i
。我仍然很想解释为什么。我真的很困惑为什么self.
不工作。