Rails:如果满足某些条件,我如何运行before_save?

Shp*_*ord 12 model ruby-on-rails

我有一个我调用的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
Run Code Online (Sandbox Code Playgroud)

该方法是我Item模型的一部分.

当我创建一个新项目或需要更新与项目相关联的图像时,这很有用......但问题是,如果我需要更新项目而不是图像,该randomize_file_name方法仍然会运行并重命名该文件数据库(虽然不是文件本身,显然).

所以,我认为我需要找到一种方法,只有randomize_file_name在表单提交中包含一个文件才能运行...但我不知道如何解决这个问题.

Sim*_*tti 12

使用脏对象.

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
Run Code Online (Sandbox Code Playgroud)