update tutorial rails generate create and ruby-on-rails model

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