Ruby on rails Rails:如果满足某些条件,如何在保存前运行?

Ruby on rails Rails:如果满足某些条件,如何在保存前运行?,ruby-on-rails,model,Ruby On Rails,Model,我调用了一个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

我调用了一个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
该方法是我的
项目
模型的一部分

当我创建一个新项目或需要更新与项目关联的图像时,这非常有效……但问题是,如果我需要更新一个项目而不是图像,那么
randomize\u file\u name
方法仍然会运行并重命名数据库中的文件(当然不是文件本身)


因此,我想我需要找到一种方法,如果表单提交中包含文件,则只运行
随机化\u file\u name
,但我不确定如何实现这一点。

只需在函数顶部快速检查,如果不需要执行任何操作,则返回

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
评论后编辑:

你可以使用Simone Carletti提到的脏东西,或者你可以发挥创意

在模型中:

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" %>
“1”%%>

继续,在每次保存时调用before_save方法,但作为现在调用“before save”方法的第一步,您应该有一个if条件,用于测试您需要的特定情况。

使用


仅当文件已更改时才进行检查。90%的时间都能正常工作

,但问题是,如果表单不包含上载,那么它只会从数据库中提取该ID的“screen\u file\u 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 :randomize_file_name

def randomize_file_name
  if screen_file_name
    extension = File.extname(screen_file_name).downcase
    key = ActiveSupport::SecureRandom.hex(8)
    return self.screen.instance_write(:file_name, "#{key}#{extension}") unless !screen_changed?
  end
end