Принимает вложенный атрибут с виртуальным атрибутом - PullRequest
9 голосов
/ 09 апреля 2011

У меня есть модель проекта, которая принимает вложенные атрибуты для задач. И задача имеет виртуальный атрибут «имя». Поэтому каждый раз, когда я меняю имя, перед обновлением оно сохраняется как encrypted_task_name. На странице редактирования проекта форма имеет поле ввода для имени задачи (а не encrypted_task_name). Когда я изменяю имя и так как имя является виртуальным атрибутом, Rails не обнаруживает изменения в Task и не обновляет эту задачу при обновлении Project.

Как убедиться, что задание сохранено, даже если его виртуальные атрибуты изменены во время обновления проекта?

Одна опция, которую я не хочу использовать: autosave => true для task.rb, так как моя задача редко обновляется.

Ответы [ 3 ]

26 голосов
/ 12 мая 2011

Я столкнулся с той же проблемой. Использование :autosave => true даже не сработало для меня. Мне удалось решить эту проблему, добавив attribute_will_change!(:my_virtual_attribute) к автору для моего виртуального атрибута. Итак, в вашем случае:

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

0 голосов
/ 04 ноября 2012

Проверить Фильтры атрибутов драгоценный камень. Он заботится о виртуальном отслеживании атрибутов (автоматически упаковывая методы сеттера), добавляя ключевое слово attr_virtual DSL и позволяет вам делать другие вещи, такие как декларативная фильтрация атрибутов:

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
0 голосов
/ 09 апреля 2011

В общем, я бы порекомендовал RailsCasts.com - эпизоды 167 и 16

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

В эпизоде ​​167 Райан делает нечто очень похожее

Если это не поможет, не могли бы вы опубликовать соответствующий код для моделей Project и Task?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...