簡體   English   中英

Rails:如果滿足某些條件,我如何運行before_save?

[英]Rails: How do I run a before_save only if certain conditions are met?

我有一個我調用的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 :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

僅檢查文件是否已更改。 90%的時間都有效

繼續並在每次保存時調用你的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

評論后編輯:

你可以使用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" %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM