【问题标题】:Why can I still use access an attribute in rails console without attr_accessible?为什么我仍然可以在没有 attr_accessible 的情况下在 rails 控制台中使用访问属性?
【发布时间】:2014-08-05 18:46:54
【问题描述】:

我是学习 Rails 的新手,但我目前对 attr_accessible 的理解是它使类的属性在类范围之外可用。

但是,如果不创建属性 attr_accessible,我可以在 Rails 控制台的辅助方法参数中访问该属性。

'005 > Todo.create(:todo_item => "Pay internet bill")

   (0.1ms)  begin transaction

  SQL (0.6ms)  INSERT INTO "todos" ("created_at", "todo_item", "updated_at") VALUES (?, ?, ?)  [["created_at", Sat, 18 Aug 2012 09:55:33 UTC +00:00], ["todo_item", "Pay internet bill"], ["updated_at", Sat, 18 Aug 2012 09:55:33 UTC +00:00]]

   (339.1ms)  commit transaction

 => #<Todo id: 6, todo_item: "Pay internet bill", created_at: "2012-08-18 09:55

但是在控制器动作中做同样的事情:

def add

   Todo.create(:todo_item => params[:todo_text])

   redirect_to :action => 'index'

  end

在我需要指定的模型中

 attr_accessible :todo_item

为什么这个属性可以在 Rails 控制台中访问,但不能在控制器方法中访问?

【问题讨论】:

标签: ruby-on-rails ruby scope attr-accessible


【解决方案1】:

ActiveRecord 根据数据库模式自动创建属性。这是一个表面上类似于但独立于作为核心 Ruby 一部分的attr_accessor 系统的系统。

在内部,他们没有任何共同点。 attr_accessor 只是一个简单实例变量的包装器,但在模型实例内部还有很多事情要做。

您可以为模型添加可访问的属性,用于需要临时存储但不需要存储在数据库中的内容。不过,这种做法并不常见。

【讨论】:

  • 这是否意味着我可以使用等价符号访问 Rails 中属性的实例变量,而无需指定 attr_accessor,因为 Rails 会自动创建属性?
  • 是的,如果它是与数据库中的列相对应的属性,您可以使用哈希 todo1[:name] 或点 todo1.nametodo1.read_attribute(:name) 从模型中直接访问它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多