У меня есть before_save метод, который я называю, который переименовывает загруженное изображение.
before_save :randomize_file_name
def randomize_file_name
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
self.screen.instance_write(:file_name, "#{key}#{extension}")
end
Тот метод является частью моего Item
модель.
Это работает отлично, когда я создаю новый объект или потребность обновить изображение, связанное с объектом..., но проблема - это, если я должен обновить объект, но НЕ изображение, randomize_file_name
метод все еще выполняется и переименовывает файл в базе данных (хотя не сам файл, очевидно).
Так, я думаю, что должен выяснить способ только работать randomize_file_name
если файл включен в представление формы..., но я не уверен, как осуществить это.
Использовать грязные предметы.
before_save :randomize_file_name
def randomize_file_name
# assuming the field that holds the name
# is called screen_file_name
if screen_file_name_changed?
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
self.screen.instance_write(:file_name, "#{key}#{extension}")
end
end
Сделайте ваш метод before_save вызываемым при каждом сохранении, но в качестве первого шага внутри метода, который вы сейчас вызываете «перед сохранением», у вас должно быть условие if, которое проверяет конкретный случай, который вам нужен.
Просто сделайте быструю проверку в начале функции и вернитесь, если ничего не нужно делать.
def randomize_file_name
return unless screen_file_name # or whatever check you need to do
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
self.screen.instance_write(:file_name, "#{key}#{extension}")
end
Редактировать после комментария:
Вы можете использовать грязный объект, как упоминал Симоне Карлетти, или подойти творчески.
В модели:
attr_accessor :some_random_field_name_for_you_to_rename
def randomize_file_name
return unless some_random_field_name_for_you_to_rename
extension = File.extname(screen_file_name).downcase
key = ActiveSupport::SecureRandom.hex(8)
self.screen.instance_write(:file_name, "#{key}#{extension}")
end
В форме:
<%= f.hidden_field :some_random_field_name_for_you_to_rename, :value => "1" %>