0

私は 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_accessorattr_writerプラスattr_readerですよね?attr_writer警告で使用するよう求められるのはなぜですか?

2/ モデルから属性を書き込む方法 (およびその理由)

3/ コントローラーから属性を書き込む方法 (およびその理由)

どうもありがとう!

アップデート

さらにテストした後、それを行う適切な方法は@parent = id.to_i. 私はまだ理由を説明したいと思っています。self.なぜうまくいかないのか、本当に混乱しています。

4

1 に答える 1

1

Atttr_accessor は問題ないはずです。あなたのモデルでは、4 つの異なる方法で同じことをしようとしているように見えます。

def parent=(id)
  write_attribute(:parent, id.to_i)
  self.parent = id.to_i
  self[:parent] = id.to_i
  @parent = id.to_i            # <- all these are redundant and scary
end

(さらに、コントローラーでは、同じことを不必要に別の方法で実行しようとしているように見えます。) また、構文 'def parent=(id)' は実際の属性専用であると確信しています。この Railscastを見て、私自身の経験から、仮想属性に対して次のようなことを行うだけです。

def parent
  @id.to_i
end

「親」に入るはずの「id」はどこから来るのですか? 仮想属性は、実際の属性または関連付けの実際の属性を介して、実際にデータベースに格納されているものに何らかの形で関連付ける必要があります。親が実際に計算されるはずのものについてもう少し説明すると、助けやすくなります。

于 2013-11-23T01:29:28.863 に答える