Рельсы определяют, изменились ли объекты из объектов acceptpts_nested_attributes_for? - PullRequest
3 голосов
/ 17 сентября 2010

Я знаю об основных методах индикатора загрязнения для рельсов, которые работают, если прямые атрибуты объекта изменились, мне интересно, как определить, обновлялись ли мои дети ..

У меня есть формадля коллекции файлов мы назовем ее папкой .Папка accept_nested_attributes_for: files.Что мне нужно определить (в рамках действия контроллера), так это то, отличаются ли файлы, содержащиеся в хэше params, от файлов в базе данных. Итак, пользователь удалил один из файлов * 1006?*, они добавили новый файл , или оба (удалите один файл и добавьте другой)

Мне нужно определить это, потому что мне нужно перенаправить пользователяк другому действию, если они удалили файл, вместо добавления нового файла, вместо только что обновленных атрибутов папки.

1 Ответ

3 голосов
/ 29 сентября 2010
def update
  @folder = Folder.find(params[:id])
  @folder.attributes = params[:folder]

  add_new_file = false
  delete_file = false
  @folder.files.each do |file|
    add_new_file = true if file.new_record? 
    delete_file = true if file.marked_for_destruction?
  end  

  both = add_new_file && delete_file

  if both
    redirect_to "both_action"
  elsif add_new_file
    redirect_to "add_new_file_action"
  elsif delete_file
    redirect_to "delete_file_action"
  else
    redirect_to "folder_not_changed_action"
  end 
end

Иногда вы хотите знать, что папка меняется без определения как. В этом случае вы можете использовать режим autosave в вашей ассоциации:

class Folder < ActiveRecord::Base 
  has_many :files, :autosave => true
  accepts_nested_attributes_for :files
  attr_accessible :files_attributes
end

Тогда в контроллере вы можете использовать @folder.changed_for_autosave?, который возвращает, была ли эта запись каким-либо образом изменена (new_record ?, отмечено_for_destruction ?, изменена?), В том числе изменена ли любая из его вложенных ассоциаций автосохранения. *

Обновлены.

Вы можете переместить специфическую логику модели из контроллера в метод в модели folder, например. @folder.how_changed?, который может возвращать один из символов: add_new_file,: delete_file и т. Д. (Я согласен с вами, что это лучший метод, я бы просто попытался упростить задачу). Тогда в контроллере вы можете сохранить логику довольно просто.

case @folder.how_changed?
  when :both
    redirect_to "both_action"
  when :add_new_file
    redirect_to "add_new_file_action"
  when :delete_file
    redirect_to "delete_file_action"
  else
    redirect_to "folder_not_changed_action"
end

В этом решении используются 2 метода: new_record? и marked_for_destruction? для каждой дочерней модели, поскольку метод Rails in-box changed_for_autosave? может сказать только то, что дочерние элементы были изменены без того, как. Это просто способ использования этих индикаторов для достижения вашей цели.

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