ruby-on-rails - generate - ruby on rails tutorial
Rieles: ¿cómo ejecuto un before_save solo si se cumplen ciertas condiciones? (4)
Tengo un método before_save que llamo que cambia el nombre de una imagen cargada.
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
Ese método es parte de mi modelo de Item
.
Eso funciona muy bien cuando creo un nuevo elemento o necesito actualizar la imagen asociada con un elemento ... pero el problema es que si necesito actualizar un elemento pero NO la imagen, el método randomize_file_name
aún se ejecuta y cambia el nombre del archivo en la base de datos (aunque no el archivo en sí, obviamente).
Entonces, creo que necesito encontrar una forma de ejecutar solo randomize_file_name
si se incluye un archivo en el envío del formulario ... pero no estoy seguro de cómo hacerlo.
Simplemente haz una comprobación rápida en la parte superior de la función y regresa si no necesitas hacer nada.
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
Editar después de comentar:
Puedes usar el objeto sucio como lo menciona Simone Carletti, o puedes ser creativo.
En el modelo:
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
En la forma:
<%= f.hidden_field :some_random_field_name_for_you_to_rename, :value => "1" %>
Usa objetos sucios .
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
siga adelante y haga que se invoque su método before_save en cada operación de guardado, pero como primer paso dentro del método que ahora ha llamado "antes de guardar" debe tener una condición if que pruebe el caso específico que necesita.
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
Esto solo verifica si el archivo ha cambiado. Funciona el 90% del tiempo