[英]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.