簡體   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