![](/img/trans.png)
[英]Virtual Attribute is nil when saving via accepts_nested_attributes_for
[英]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.