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?
может сказать только то, что дочерние элементы были изменены без того, как. Это просто способ использования этих индикаторов для достижения вашей цели.