Скрепка, before_save и удаление вложений

Я не могу заставить этот фильтр before_save работать. Мои методы довольно стандартны, я думаю. Изображения загружаются через Paperclip.

before_save :remove_checked_attachments

def attachments
  %w(banner footer logo accreditation)
end

private

def remove_checked_attachments
  attachments.each do |a|
    if "remove_#{a}".to_sym && !"#{a}_updated_at_changed?".to_sym
      "#{a}".to_sym.destroy
    end
  end
end

Параметры remove_... передаются, но ничего не удаляется:

... "remove_banner"=>"1" ...

Есть предположения? Спасибо.

Обновить

Даже упрощение до этого не работает:

after_validation { banner.clear if remove_banner == '1' }

И "remove_banner"=>"1" проходит через параметры. u.banner.clear, затем u.banner.save отлично работает в консоли.


person okay56k    schedule 20.05.2014    source источник
comment
Когда вы destroy #{a}.to_sym - где хранятся эти данные? Это уже в БД или часть хэша параметров?   -  person Richard Peck    schedule 20.05.2014
comment
#{a} представляет каждое приложение скрепки в модели.   -  person okay56k    schedule 21.05.2014


Ответы (1)


Я решил это, создав такую ​​​​проблему:

# must be included after attachment declarations in model
module RemoveAttachment
  extend ActiveSupport::Concern

  included do
    attachment_definitions.keys.each do |name|

      attr_accessible :"remove_#{name}"
      attr_accessor :"remove_#{name}"

      before_validation { send(name).destroy if send("remove_#{name}") == '1' }

      define_method :"remove_#{name}=" do |value|
        instance_variable_set :"@remove_#{name}", value
        send("#{name}_file_name_will_change!")
      end

    end
  end
end

И просто включение беспокойства там, где это необходимо. Благодаря этому ответу за огромную подсказку.

person okay56k    schedule 10.06.2014