繁体   English   中英

接受具有虚拟属性的嵌套属性

[英]Accepts Nested Attribute with a virtual attribute

我有一个项目模型,它接受任务的嵌套属性。 而Task有一个虚拟属性“name”。 所以每次我更改名称时,它都会在更新前作为 encrypted_task_name 持久化。 在项目编辑页面上,表单有一个任务名称输入字段(而不是 encrypted_task_name)。 当我更改名称并且由于名称是虚拟属性时,Rails 不会检测到 Task 中的更改,并且在更新 Project 时不会更新该任务。

即使在项目更新期间更改了其虚拟属性,我如何确保保存该任务?

我不想使用的一个选项是 :autosave => true on task.rb 因为我的任务很少更新。

我遇到了同样的问题。 使用:autosave => true甚至对我不起作用。 我设法通过将attribute_will_change!(:my_virtual_attribute)到我的虚拟属性的 writer 来解决它。 所以,在你的情况下:

class Task < ActiveRecord::Base
  ..
  def name=(the_name)
    attribute_will_change!(:name)
    ..
  end
  ..
end

这将对象标记为未更改或脏的,并且使 update_attributes 正确保存嵌套模型。

链接:

http://apidock.com/rails/ActiveRecord/Dirty/attribute_will_change%21 http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects

对于 Rails 5.1 及更高版本,建议使用attribute而不是attr_accessor因为它会attr_accessor对象,从而触发验证。

class Task < ActiveRecord::Base
  attribute :name, :string
end

查看属性过滤器gem。 它通过添加attr_virtual DSL 关键字来处理虚拟属性跟踪(自动包装 setter 方法),并允许您执行其他操作,例如属性的声明式过滤:

class User < ActiveRecord::Base
  include ActiveModel::AttributeFilters::Common::Split

  split_attribute   :real_name => [ :first_name, :last_name ]
  before_validation :filter_attributes

  attr_virtual  :real_name
  attr_accessor :real_name
end

一般来说,我会推荐 RailsCasts.com - 第 167 和 16 集

http://railscasts.com/episodes/167-more-on-virtual-attributes
http://railscasts.com/episodes/16-virtual-attributes

在第 167 集中,瑞安做了一些非常相似的事情

如果这没有帮助,您能否为您的项目和任务模型发布相关代码?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM