2012-08-01 10 views
9

Los usuarios en mi sitio pueden cargar sus propias fotos para un modelo o elegir de una biblioteca. Cuando los usuarios eligen de la biblioteca, envío el nombre del archivo como una cadena al servidor {file: {url: 'url.jpg'}}. No he encontrado una forma en que carrierwave pueda simplemente actualizar un archivo modelo sin cargarlo. Puedo escribir una condición en mi modelo que compruebe la existencia de ese parámetro y luego model.file = File.open('str.jpg'). ¿Eso es malo desde una vista de seguridad? ¿Cómo puedo "cargar" archivos, o simplemente actualizar el atributo del archivo, para hacer referencia a un archivo que ya está disponible en el servidor?Carrierwave - "cargando" un archivo de una cadena

Gracias!

Respuesta

4

Su solución de utilizar File.open funcionaría, pero se debe verificar que el nombre es válido con File.basename por lo que alguien no podía pasar y ../../secret_credentials.yml exponer información que usted no quiere. También sería una buena idea verificarlo contra la lista de imágenes preestablecidas.

Sin embargo, puede hacer esto de manera más eficiente omitiendo CarrierWave en este caso.

Añadir un nuevo campo llamado library_image, cuando alguien quiere utilizar una imagen preestablecida, a continuación, establece library_image, si quieren utilizar su propia foto, desarmar library_image y subir la foto de forma normal. A continuación, agregue un método de ayuda como:

def avatar_url 
    if self.library_image? 
     "http://example.com/images/#{self.library_image}" 
    else 
     self.picture.url 
    end 
end 

Esto supone que se pueden encontrar las imágenes predefinidas en http://example.com/images/[name] y se está utilizando en mount_uploader CarrierWave nombrado picture.

Ahora, cada vez que desee mostrar su imagen, deberá llamar al avatar_url, que comprobará si debe devolver la URL preestablecida, o la imagen que cargaron.

Un ejemplo de cómo se actualizará library_image o picture basado en su pregunta original:

if params[:file].is_a?(Hash) 
    model.library_image = params[:file][:url] 
    model.remove_picture = true 
else 
    model.library_image = nil 
    model.picture = params[:file] 
end 
+0

¿Cómo puedo detectar que el usuario suba una nueva imagen? Quiero decir, ¿cuál es el nombre de la función de devolución de llamada que debería escribir para restablecer la library_image? ¡Gracias! – CamelCamelCamel

+0

@CamelCamelCamel He actualizado mi respuesta original con un ejemplo. –

+0

¿Cómo devuelvo el archivo como el preset o el archivo según avatar_url? – CamelCamelCamel

3

Haría otro recurso llamado LibraryImages que contenga estos archivos de imagen.

Estos estarían en relación con la clase de usuario que utiliza la asociación has_many. el segundo es para separar cuando un usuario quiere usar su propia imagen en lugar de una imagen predefinida.

por lo tanto, sugeriría agregar un tipo booleano llamado 'use_library', una vez que elijan usar su propia imagen, simplemente la cargará al user.image sin ningún problema.

ahora en su opinión sólo pregunte si el use_library devuelve verdadero si a fin de utilizar image_tag(user.library_image)

Cuestiones relacionadas