私は 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.
なぜうまくいかないのか、本当に混乱しています。