2010-04-28 15 views
12

Yüklediğim bir görüntüyü yeniden adlandırdığım, aradığım bir before_save yöntemim var.Raylar: Yalnızca belirli koşullar karşılanırsa bir before_save nasıl çalıştırırım?

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 

Bu yöntem benim Item modelimin bir parçasıdır.

Yeni bir öğe oluşturduğumda veya bir öğeyle ilişkili görüntüyü güncellemem gerektiğinde bu harika çalışıyor ... ancak sorun şu ki, bir öğeyi güncellemem gerekirse ancak görüntüyü randomize_file_name yöntemi çalıştırıyor ve dosyayı veritabanında yeniden adlandırır (açıkçası dosyanın kendisi değil).

Yani, bir dosya form gönderiminde yer alıyorsa, yalnızca randomize_file_name'u çalıştırmanın bir yolunu bulmam gerektiğini düşünüyorum ... ama bunu nasıl yapacağımı bilmiyorum.

cevap

12

dirty objects'u kullanın.

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 
+0

Daha ayrıntılı belgeler burada: http://apidock.com/rails/ActiveRecord/Dirty –

+1

Bu da onu almayacak. Kullanıcı aynı dosya adına sahip yeni bir dosya yüklerse ne olur? Bu durumda dosya_adı aynı olacak ancak farklı bir anahtar isteyebilirsiniz. –

0

Sadece işlevin en üstünde hızlı bir kontrol yapın ve bir şey yapmanıza gerek yok ise geri dönün. Yorumlarınız sonra

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 

Düzenleme: Simone Carletti tarafından belirtildiği gibi

Sen kirli nesne kullanabilirsiniz veya yaratıcı alabilirsiniz.

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 

formda:

<%= f.hidden_field :some_random_field_name_for_you_to_rename, :value => "1" %> 
+0

Ancak sorun şu ki, form bir yükleme içermiyorsa, o zaman bu ekran için "screen_file_name" dosyasını veritabanından çeker ... Özellikle form gönderiminin içerip içermediğini kontrol etmem gerekiyor Görüntü alanı için bir şey ... ve bunu modelden nasıl yapacağımı bilmiyorum. – Shpigford

1

devam edin ve her kaydedildiğinde üzerinde before_save yöntemi denir yapmak ancak yöntemin içinde bir ilk adım olarak şimdi adlandırılan sahip olan Modelinde

"kaydetmeden önce", ihtiyacınız olan özel durumu test eden bir koşulunuz olması gerekir.

4
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 

Bu dosya değişti sadece denetler. Zamanın% 90'ı

İlgili konular