Ruby on rails Rails 3.2,虚拟访问器和弃用警告

Ruby on rails Rails 3.2,虚拟访问器和弃用警告,ruby-on-rails,ruby,attributes,virtual-attribute,Ruby On Rails,Ruby,Attributes,Virtual Attribute,我真的对Rails3.2中的虚拟属性感到困惑,我所有的研究都没有帮助我把事情弄清楚 # input model class Input < ActiveRecord::Base # Attributes -------------------- attr_accessible :title, :parent attr_accessor :parent def parent=(id) wrtite_attribute(:parent, id.to_i) s

我真的对Rails3.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
#输入模型
类输入true do | t|
t、 字符串“title”
t、 datetime“created_at”,:null=>false
t、 datetime“updated_at”,:null=>false
结束
在上面,我已经汇编了我在互联网上找到的几乎所有备选方案。这不是我运行的代码,只是同一事物的两个版本。尽管如此,无论我如何尝试,我都会得到以下警告:

弃用警告:您正在尝试创建属性“parent”。不推荐在模型上写入任意属性。请使用“attr\u writer”等。

有时,我甚至会得到一个
堆栈级别太深
。我很想了解属性是如何工作的

1/
attr\u访问器
attr\u编写器
plus
attr\u读取器
对吗?为什么要求我在警告中使用
attr\u writer

2/我应该如何从模型中写入属性(以及为什么)

3/我应该如何从控制器写入属性(以及为什么)

非常感谢

更新


经过进一步的测试,看起来正确的方法是
@parent=id.to_i
。我仍然希望得到解释。我真的很困惑为什么
self.
不起作用。

ATTTRU访问器应该可以。因此,在您的模型中,看起来您正试图用四种不同的方式做相同的事情:

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

“id”是从哪里来的,应该进入“父”的?虚拟属性必须以某种方式与数据库中实际存储的内容相关,可以通过真实属性,也可以通过关联的真实属性。如果你再解释一下父母的实际计算依据,会更容易提供帮助。

我已经更新了我的问题。谢谢,这不是我运行的代码,只是我遇到过的同一件事情的四个示例。我只是不知道什么是什么,用什么。我看了这个Railscapst,但它仍然会抛出弃用警告<代码>自我。父母是个问题。哈哈哦,好吧。那么,父母应该根据什么来计算呢?id从何而来?同样,您收到警告的原因是parent=(id)试图创建一个真正的属性,这不是您想要做的。尝试我上面给出的方法。parent是我表单中的一个字段,让我定义一个关系。这是一种非传统的使用关系的方式,但我有点被现有的结构所迫。它收到一个id,然后用一些魔法来建立关系,就这样。我在DB中不需要它,因为关系已经在其他地方表达了(它不是一个属于关系)。在railscast中,以美元表示的价格不是一个真正的属性。真正的价格是美分。parent=在技术上并不局限于实际属性,它是一种与其他方法类似的方法。据我所知,attr_writer或attr_accessor正在后面创建此函数。
def parent
  @id.to_i
end