Направляющие: Как я выполняю before_save, только если определенные условия соблюдены?

У меня есть 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 если файл включен в представление формы..., но я не уверен, как осуществить это.

12
задан Shpigford 28 April 2010 в 18:08
поделиться

3 ответа

Использовать грязные предметы.

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
12
ответ дан 2 December 2019 в 19:53
поделиться

Сделайте ваш метод before_save вызываемым при каждом сохранении, но в качестве первого шага внутри метода, который вы сейчас вызываете «перед сохранением», у вас должно быть условие if, которое проверяет конкретный случай, который вам нужен.

1
ответ дан 2 December 2019 в 19:53
поделиться

Просто сделайте быструю проверку в начале функции и вернитесь, если ничего не нужно делать.

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" %>
0
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: