Crea una aplicación de transmisión de música simple con Ruby on Rails

Amazon S3 es una excelente manera de almacenar archivos, pero aprender a integrarlos en su sitio web puede ser un desafío. En este artículo, aprenderá cómo integrar Amazon S3 y Ruby on Rails a través de la construcción de una sencilla aplicación de transmisión de música..


Qué es y cómo funciona?

Amazon S3 es "almacenamiento para internet"

Como lo indica el sitio web de Amazon, Amazon S3 es "almacenamiento para Internet". No solo es barato, sino que también es rápido y confiable. Es una excelente manera de mostrar contenido en su sitio web, incluidas imágenes, videos o casi cualquier cosa que desee. Amazon S3 no funciona exactamente como el almacenamiento en su computadora, así que aquí hay algunas cosas que debe saber:

  • Con Amazon S3, las carpetas se llaman "depósitos" y los archivos se llaman "objetos".
  • Los cubos en el nivel superior se usan para determinar la URL para acceder a sus datos, por lo que solo puede usar nombres que aún no se han tomado. Por ejemplo, si alguien ya creó un grupo de nivel superior con el nombre "videos", no puede usar ese nombre.
  • Es una buena idea tener un grupo de nivel superior con el nombre de su sitio web, y usar subniveles de grupos para separar los archivos en diferentes secciones, como imágenes, videos o música..

Antes de que comencemos?

Antes de continuar con este tutorial, hay algunas cosas clave que deben estar en su lugar:

  • El intérprete de Ruby y RubyGems instalados en tu computadora, junto con la gema Rails
  • Conocimiento de (o al menos tener acceso a) su ID de clave de acceso y Clave de acceso secreta para Amazon S3
  • Una comprensión básica de Ruby on Rails

Lo que estaremos construyendo

El producto final de este tutorial es una sencilla aplicación de transmisión y descarga de música. En esta aplicación, el usuario podrá hacer lo siguiente:

  • Ver una lista de toda la música cargada actualmente y subir la música ellos mismos
  • Descargue la música de varias maneras, incluyendo transmitirla con audio HTML5, descargarla a través de HTTP o descargarla a través de un archivo .torrent

En el momento en que se complete esta aplicación, habrá aprendido todos los temas principales que debe saber sobre el uso de Amazon S3 en su aplicación Ruby on Rails.


Empecemos!

La gema aws-s3 le permite interactuar con el servicio Amazon S3 en su aplicación.

Lo primero que hay que hacer es instalar el aws-s3 gema de rubí. La gema le permite interactuar con el servicio Amazon S3 en su aplicación. Para hacer esto, si está en Windows, simplemente ejecute el comando:

 gema de instalar aws-s3

Después de que se instale, genere nuestra aplicación Rails con el siguiente comando:

 rieles nuevo mp3app

El último paso para iniciar su aplicación es ir al directorio mp3app / public y eliminar el archivo llamado "index.html". Una vez que se completa, su aplicación está lista para comenzar a interactuar con Amazon S3!


Iniciar sesión en Amazon S3

Su ID de clave de acceso y su Clave de acceso secreta le permiten conectarse a Amazon S3.

Para que podamos interactuar con Amazon S3, necesitamos decirle a nuestra aplicación cómo iniciar sesión en Amazon S3. Aquí es donde su ID de clave de acceso y Clave de acceso secreta son útiles. Su ID de clave de acceso y Clave de acceso secreta le permiten conectarse a Amazon S3. Pero primero, tenemos que decirle a nuestra aplicación que estamos usando el aws-s3 joya. Hacemos esto en el Gemfile:

 gema 'aws-s3',: require => 'aws / s3'

Para que nuestra aplicación utilice esa gema, deberás escribir instalar paquete de comandos. Ahora que está funcionando, debemos decirle a nuestra aplicación cómo iniciar sesión en Amazon S3. También hacemos eso en el config / application.rb archivo, en una nueva línea dentro de la clase de aplicación:

 AWS :: S3 :: Base.establish_connection! (: Access_key_id => 'Ponga aquí su ID de la clave de acceso',: secret_access_key => 'Ponga su clave de acceso secreta aquí')

Este código le dice a nuestra aplicación que cree una conexión a Amazon S3 tan pronto como se inicie la aplicación (el aplicacion.rb archivo se carga cuando se inicia su aplicación). Una última cosa que debe agregarse al archivo de la aplicación es una constante con el valor del depósito que usaremos. La razón para hacer esto es que si alguna vez necesitamos cambiar el grupo que estamos usando, solo se debe actualizar en esta ubicación. Debería verse algo como esto:

 CUBO = "s3tutorialmusic"

Para este tutorial, decidí nombrar el cubo s3tutorialmusic, pero deberías reemplazarlo con cualquier cubo que tengas en tu cuenta. Al final, su archivo debería tener este aspecto (pero con su propia información de inicio de sesión):

 requiera File.expand_path ('? / boot', __FILE__) requiera 'rails / all' Bundler.require (: default, Rails.env) si está definido? (Bundler) módulo Mp3app class Aplicación < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] AWS::S3::Base.establish_connection!( :access_key_id => 'Ponga aquí su ID de clave de acceso',: secret_access_key => 'Ponga aquí su clave de acceso Secred') BUCKET = fin de 's3tutorialmusic'

Generando el controlador

Ahora podemos comenzar a trabajar para que nuestra aplicación muestre algo en el navegador. Para empezar, vamos a generar el controlador y las vistas que necesitaremos. En total, generaremos tres acciones para nuestro controlador (a las que llamaremos canciones): indexar, subir y borrar.

  • La acción del índice será nuestra página principal..
  • La acción de carga es para cargar música nueva en Amazon S3, por lo que no necesita una vista.
  • Finalmente, la acción de eliminar no tendrá una vista y será responsable de eliminar la música.

Al final, la única vista que necesitaremos para esta aplicación es la vista de índice, ya que actuará como un panel de control central para cada acción que pueda realizar. Ahora, combinaremos todo eso en una bonita declaración de línea de comando:

 rieles g controlador canciones índice subir eliminar

Una vez que haya terminado de ejecutarse, siga adelante y elimine las vistas generadas para subir y borrar, porque no serán utilizados. Pasemos a escribir el código para la acción de índice.!


Trabajando en el Índice de Acción

En la acción de índice, el producto terminado permitirá a los usuarios cargar música nueva y eliminar la música existente. No hay nada que deba hacerse en el archivo del controlador de esta acción para cargar nueva música, pero necesitamos una lista de las canciones actuales para que los usuarios puedan eliminarlas..

Primero, necesitamos obtener un objeto que se refiera a nuestro grupo de música (recuerde que el nombre de ese grupo se almacena en el BUCKET constante). Así es como lo hacemos:

 AWS :: S3 :: Bucket.find (CUBO)

Para poder utilizar los métodos disponibles en el aws-s3 gema, tenemos que decirle al intérprete de Ruby que queremos buscar las funciones en el AWS :: S3 espacio de nombres, por lo que es parte de la llamada al método. los Cangilón La clase contiene todos los métodos relacionados con la manipulación de cubos. Finalmente, el encontrar el método acepta un parámetro, el nombre del grupo, y devuelve un objeto que se refiere a ese grupo. Ahora que tenemos el cubo, obtengamos todos sus objetos haciendo esto:

 AWS :: S3 :: Bucket.find (BUCKET) .objects

los objetos método devuelve un hash con los nombres de todos los objetos en ese cubo. Finalmente, necesitamos almacenar el resultado de esa llamada de método en una variable de instancia para que podamos usarlo en nuestra vista. Al final, así es como se verá la acción del índice:

 def index @songs = AWS :: S3 :: Bucket.find (BUCKET) .objets end

Continuando con la vista de índice

Ahora necesitamos hacer la vista para que el usuario cargue y borre música. Comencemos con el último y creemos una lista desordenada de todos los objetos cargados actualmente, con un enlace para eliminar ese objeto. Podemos hacerlo así:

 
    <% @songs.each do |song| %>
  • <%= song.key %> - <%= link_to "Delete", "songs/delete/?song=" + song.key, :confirm => '¿Estás seguro de que deseas eliminar' + song.key + '?' %>
  • <% end %>
  • Primero, creamos una lista desordenada..
  • Luego, pasamos por todas las canciones del canciones variable mediante el uso de cada método.
  • Para cada canción, creamos un elemento de la lista y construimos el texto que aparecerá para cada elemento. La primera parte es la clave de las canciones, porque cada canción es un hash, y la clave para ese hash es el nombre de la canción.
  • Luego, ponemos un enlace a la acción de eliminar, donde se puede eliminar la canción. Para la URL, usamos una cadena de consulta al final para indicar a la acción de eliminar qué canción se debe eliminar..
  • Finalmente, tenemos un mensaje de confirmación para advertir al usuario antes de que realmente elimine la canción..
 if (params [: song]) AWS :: S3 :: S3Object.find (params [: song], BUCKET) .delete redirect_to root_path else render: text => "¡No se encontró ninguna canción para eliminar!" fin
  • Primero, verificamos que el parámetro de la canción esté especificado.
  • Si lo fue, entonces usamos el método de búsqueda para obtener el objeto que representa esa canción.
  • Finalmente, usamos el método de eliminación para eliminarlo de Amazon S3..
  • Luego, debemos redirigir al usuario a una nueva página porque la acción de eliminar no tiene vista. Sin embargo, si el parámetro de la canción nunca se especificó, simplemente representamos el texto "¡No se encontró ninguna canción para eliminar!".

Dejar que el usuario cargue música

Ahora, debemos permitir que el usuario cargue música, ya que esa fue una de las piezas principales de la funcionalidad de esta aplicación. Primero, creamos un formulario simple que le permite al usuario elegir un archivo para cargar. Podemos hacerlo así:

 

Sube un nuevo MP3:

<%= form_tag upload_path, :method => "post",: multipart => true do%> <%= file_field_tag "mp3file" %> <%= submit_tag "Upload" %> <% end %>

Creamos un formulario que se envía a la acción de carga, que es la acción que realmente realiza la carga a Amazon S3. Usamos post y multiparte porque estamos enviando archivos. Aparte de eso, este formulario es muy simple y fácil de entender, por lo que ahora podemos pasar a implementar la parte del controlador de esta acción..


Enviar el archivo a Amazon S3

Necesitamos tomar el archivo que se envió y crear un nuevo objeto S3 para él, que se realizará en la acción de carga. Podemos hacer eso con esta línea de código:

 AWS :: S3 :: S3Object.store (sanitize_filename (params [: mp3file] .original_filename), params [: mp3file] .read, BUCKET,: access =>: public_read)

Hay mucho en esta línea de código, así que explicaré cada parte individualmente.

Como de costumbre, accedemos a la AWS :: S3 :: S3Object Para interactuar con objetos en Amazon S3..

Usamos el almacenar comando para subir archivos a S3. El primer parámetro especifica cómo llamar al archivo. Usamos el nombre_archivo original parámetro del archivo cargado para esto para que el nombre se mantenga igual. En cuanto a sanitize_filename Método, que será explicado en el siguiente párrafo. El segundo parámetro son los datos reales del archivo, que se obtienen al llamar al método de lectura en el archivo cargado. El tercer parámetro especifica el grupo a utilizar y el cuarto determina quién puede acceder al archivo. Como queremos que todos puedan leer el archivo (que incluye la descarga), especificamos el acceso como : public_read.

los sanitize_filename método es un método que ha sido utilizado por muchas personas y complementos, como adjunto_fu, y se usa para resolver un problema con Internet Explorer (impactante, ¿no es así?). En lugar de simplemente darnos el nombre del archivo cuando llamamos al método original_filename, IE devuelve la ruta completa al archivo; por ejemplo, si el archivo que queríamos subir fue llamado mysong.mp3, en vez de eso nos daría C: \ rails \ mp3app \ mysong.mp3 cuando llamamos nombre_archivo original. Podemos solucionar esto agregando el siguiente código al final del controlador:

 private def sanitize_filename (file_name) just_filename = File.basename (file_name) just_filename.sub (/ [^ \ w \. \ -] /, '_') end

Nuestro último paso para completar la acción de carga es agregar algunas verificaciones de errores y rutas. La forma en que haces el control de errores en ruby ​​es con un ¿empezar? ¿rescate? fin declaración. Muchas cosas pueden salir mal al cargar un archivo, por lo que tener una verificación de errores evitará que el usuario vea un mensaje de error que Rails generaría automáticamente. Aquí está la versión modificada de la acción de carga:

 def upload begin AWS :: S3 :: S3Object.store (sanitize_filename (params [: mp3file] .original_filename), params [: mp3file] .read, BUCKET,: access =>: public_read) redirect_to root_path rescate: text => " No se pudo completar la carga "end end end

Si se produce un error, simplemente representamos un texto que se lo dice al usuario. A pesar de que el usuario sigue viendo un mensaje de error, es mejor que una enorme lista de códigos que aparecería en un mensaje de error generado por Rails.


Enrutando nuestra aplicación

Es posible que haya notado que a lo largo del código que hemos escrito hasta ahora, ha habido muchas veces donde algo como upload_path Se ha utilizado en lugar de especificar un controlador y una acción. Podemos hacer esto debido a un archivo llamado route.rb. Esto le dice a nuestra aplicación a qué URL se puede acceder en nuestra aplicación. También le damos nombres a ciertas rutas para facilitar la actualización de nuestro código. Aquí es cómo puede nombrar las rutas que utilizará nuestra Mp3app:

 coincide con "songs / upload",: as => "upload" coincide con "songs / delete",: as => "delete" root: to => "songs # index"

El método de coincidencia especifica una ruta, como canciones / subir, y dale un nombre, upload_path. Ese nombre se especifica usando : as => "nombre" como el segundo parámetro para el método de coincidencia. Finalmente, el método raíz especifica qué acción será la acción raíz, que actúa de manera similar a index.html en un sitio web estático basado en HTML.


La acción de carga completa

Ahora, hemos terminado de implementar la funcionalidad de la acción de carga. Aquí está el código final para el songs_controller.rb archivo hasta ahora:

 clase SongsController < ApplicationController def index @songs = AWS::S3::Bucket.find(BUCKET).objects end def upload begin AWS::S3::S3Object.store(sanitize_filename(params[:mp3file].original_filename), params[:mp3file].read, BUCKET, :access => : public_read) redirect_to root_path rescue render: text => "No se pudo completar la carga" end end def delete if (params [: song]) AWS :: S3 :: S3Object.find (params [: song], BUCKET). delete redirect_to root_path else render: text => "¡No se encontró ninguna canción para eliminar!" end end private def sanitize_filename (file_name) just_filename = File.basename (file_name) just_filename.sub (/ [^ \ w \. \ -] /, '_') end end

Y aquí es cómo se ve la aplicación hasta ahora cuando se ve en el navegador.


Descargando la musica

Hasta ahora, nuestra aplicación ha recorrido un largo camino. El usuario ahora puede cargar música, ver una lista de la música cargada actualmente y eliminar cualquier música existente. Ahora, tenemos una última pieza de funcionalidad central para implementar. Eso es permitir que el usuario realmente descargue esta música. Como se especificó al inicio de este tutorial, el usuario puede hacerlo de tres maneras:

  • Transmítelo con HTML5 Audio,
  • Descárgalo a través de HTTP, y
  • Descárgalo utilizando un archivo torrent..

En este momento, la lista de música solo se muestra usando una lista desordenada. Sin embargo, como vamos a terminar agregando tres enlaces adicionales al final de cada línea (uno para cada método de descarga), es más factible usar una tabla para organizar la lista. Modifiquemos la vista de índice para reflejar este cambio:

 

Descargar y eliminar los MP3 existentes

<% @songs.each do |song| %> <% end %>
<%= song.key %> <%= link_to "Delete", "songs/delete/?song=" + song.key, :confirm => '¿Estás seguro de que deseas eliminar' + song.key + '?' %>
  • Primero, actualizamos el encabezado para reflejar que también podemos descargar la música..
  • En segundo lugar, cambiamos la lista desordenada a una tabla, y ponemos el nombre de la canción y el enlace de descarga por su cuenta. .

Ahora estamos listos para agregar el código para permitir que el usuario descargue música. Comencemos con la descarga a través de HTTP, porque es la más fácil de implementar.


Descarga vía HTTP

Para descargar a través de HTTP, solo necesitamos agregar una nueva a nuestra mesa con un enlace al archivo .mp3. La gema aws-s3 ha incorporado métodos que nos permiten generar la url para un archivo. Sin embargo, la mejor práctica es poner cualquier "método de ayuda" como estos en el archivo auxiliar para ese controlador. Debido a que estamos utilizando estos métodos en toda la aplicación (especialmente si decide extender esta aplicación por su cuenta), los métodos de ayuda se colocarán en el archivo application_helper.rb. Aquí es cómo se obtiene la URL:

 def download_url_for (song_key) AWS :: S3 :: S3Object.url_for (song_key, BUCKET,: authenticated => false) end

Este método solo acepta un parámetro, que es el nombre de la canción. Para ayudarnos a recordar que se puede acceder al nombre de la canción por song.key, llamamos el parámetro song_key. Como de costumbre, accedemos a la AWS :: S3 :: S3Object Clase para interactuar con objetos de Amazon S3. los url_for El método toma dos parámetros, siendo el tercero opcional..

  • El primero es el nombre del archivo que está buscando.
  • El segundo es el nombre del cubo donde se encuentra el archivo.
  • Finalmente, el tercer parámetro se usa para darnos una URL que no caducará. Si no especificamos : autentificado => falso, todas las URL caducarán en 5 minutos (de forma predeterminada).
 <%= link_to "Download", download_url_for(song.key) %>

Esta va entre el nombre de la canción y el enlace de eliminación (pero eso es preferencia personal, por lo que puede tener los enlaces en el orden que elija).


Descargando a través de Bit Torrent

La descarga de archivos desde Amazon S3 a través de Bit Torrent es muy similar a la descarga a través de HTTP. De hecho, la única diferencia entre las dos URL de descarga es que el torrent one tiene? Torrent al final. Por lo tanto, nuestro método auxiliar para generar la URL de torrent solo agregará? Torrent al final de la url de HTTP. Aquí es cómo harías eso:

 def torrent_url_for (song_key) download_url_for (song_key) + "? torrent" end

Ahora, solo necesitamos añadir otro a nuestra mesa:

 <%= link_to "Torrent", torrent_url_for(song.key) %>

Streaming con audio HTML5

Transmitir las canciones a través del audio HTML5 es un poco más difícil que solo descargar la canción, así que comencemos con la parte fácil: para ello. Sin embargo, habrá algunas diferencias con respecto a los enlaces que agregamos para HTTP y Bit Torrent.

  • Primero, necesitamos tener una forma de identificar este enlace para agregar el
  • En segundo lugar, necesitamos una forma de conocer la fuente del mp3 que se usará para la etiqueta, así que solo le daremos la misma url que la descarga HTTP. Esto también servirá como un respaldo para los navegadores con javascript deshabilitado, porque usaremos javascript para agregar el etiqueta a la página.

Aquí está el código para generar el enlace:

 <%= link_to "HTML5 Audio", download_url_for(song.key), :class => "html5"%>

Ahora debemos trabajar en el javascript para agregar la etiqueta de audio a la página cuando se haga clic en este enlace. Para hacer esto, usaremos una técnica similar a la técnica que Jeffrey Way usa en su tutorial, El elemento de audio HTML 5.. El primer paso Es agregar algunas cosas a nuestros archivos de vista. En nuestro layout / application.html.erb archivo, debemos incluir la última versión de jQuery, ya que esa es la biblioteca de javascript que usaremos. Aquí está el código para agregar justo antes de la primera línea de inclusión de javascript:

 <%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js" %>

Entonces, cambiar el primer parámetro para la etiqueta de inclusión original de: por defecto a aplicacion.js, porque ahí es donde almacenaremos nuestro código javascript y los otros archivos JavaScript predeterminados no son necesarios. A continuación, debemos agregar una sección a nuestra vista index.html.erb para colocar la etiqueta de audio. En la parte superior de esa vista, debemos colocar el siguiente código:

 

Escucha un MP3 con audio HTML5

Siguiendo con el tema HTML5, usamos una etiqueta de sección en lugar de un div para crear nuestra sección de audio.

Obtenemos una referencia a la sección de audio y la almacenamos en una variable, lo que se considera una mejor práctica. A continuación, debemos agregar un controlador de eventos de clic a nuestros enlaces con la clase html 5. Cuando ese controlador de eventos se apaga, necesitamos hacer algunas cosas:

  • Primero, necesitamos hacer una nueva etiqueta de audio y darle algunos atributos como controles.
  • Luego, debemos agregarle la etiqueta de origen para que sepa qué jugar..
  • Finalmente, debemos reemplazar el HTML en la sección de audio con la nueva etiqueta de audio y devolver el valor falso para que no se realice la acción normal del enlace, que sería la descarga de la canción. Aquí es cómo se puede poner todo junto:
 $ (document) .ready (function () var audioSection = $ ('section # audio'); $ ('a.html5'). click (function () var audio = $ ('

Ya que este tutorial es sobre Ruby on Rails, y no JavaScript, no voy a explicar en detalle cómo funciona este código. Sin embargo, el código es bastante simple, por lo que debería ser fácil para usted averiguar. Una cosa que debe tener en cuenta es que esto solo funcionará en navegadores que admitan HTML5 y que admitan mp3 como fuentes válidas para etiquetas de audio. Para la mayoría de los navegadores, la última versión admitirá este código HTML 5, pero los navegadores más antiguos no lo admiten.


Vista de índice completa

Finalmente hemos completado toda la funcionalidad central para esta aplicación. El usuario puede cargar, descargar y eliminar archivos mp3 de varias formas, como audio HTML5, descargas HTTP y Bit Torrent. Aquí es cómo debe verse la vista del índice en este punto:

 

Escucha un MP3 con audio HTML5

Sube un nuevo MP3

<%= form_tag upload_path, :method => "post",: multipart => true do%> <%= file_field_tag "mp3file" %> <%= submit_tag "Upload" %> <% end %>

Descargar y eliminar los MP3 existentes

<% @songs.each do |song| %> <% end %>
<%= song.key %> <%= link_to "HTML5 Audio", download_url_for(song.key), :class => "html5"%> <%= link_to "Download", download_url_for(song.key) %> <%= link_to "Torrent", torrent_url_for(song.key) %> <%= link_to "Delete", "songs/delete/?song=" + song.key, :confirm => '¿Estás seguro de que deseas eliminar' + song.key + '?' %>

Si aún no lo has hecho, deberías intentar ejecutar este código y probarlo por ti mismo. Puedes hacer esto ejecutando el comando: rieles. A pesar de que hemos completado la funcionalidad principal de esta aplicación, todavía hay cosas que deben hacerse, como el estilo de la página. Hagamos eso ahora.


Diseño de la aplicación

Lo primero que debe hacer es envolver la página en un contenedor para que podamos centrarla. Todo lo que necesitamos hacer es colocar un div con un id de contenedor alrededor de la declaración de rendimiento en el archivo de diseño para que se vea algo como esto:

 
<%= yield %>

A continuación, utilizaremos el estilo de la gema Ryan Bates., generadores de nifty, Para dar a nuestra aplicación un estilo básico. Aquí está el CSS que usaremos de esa gema:

 #contenedor ancho: 75%; margen: 0 auto; color de fondo: #FFF; relleno: 20px 40px; borde: sólido 1px negro; margen superior: 20px;  cuerpo color de fondo: # 4B7399; Familia tipográfica: Verdana, Helvetica, Arial; tamaño de fuente: 14px;  .clear claro: ambos; altura: 0; desbordamiento: oculto; 

Ahora vamos a trabajar la vista de índice. Lo primero que debemos hacer es dividir la página en tres secciones. Esas secciones serán un encabezado, una sección principal y una barra lateral. En la parte superior de la página, vamos a agregar un encabezado simple:

  

Mi primera aplicación de transmisión de música

A continuación, dividamos la página en una región principal y una región de barra lateral. Nuestra región principal consistirá en la lista de canciones, mientras que la barra lateral contendrá el audio HTML5 y el formulario de carga. Así es como modificaremos el código:

 

Audio HTML5

No hay canción en reproducción.

Subir una canción

<%= form_tag upload_path, :method => "post",: multipart => true do%> <%= file_field_tag "mp3file" %>
<%= submit_tag "Upload" %> <% end %>

Descargar / Eliminar canciones

<% @songs.each do |song| %> <% end %>
<%= song.key %> <%= link_to "HTML5 Audio", download_url_for(song.key), :class => "html5"%> <%= link_to "Download", download_url_for(song.key) %> <%= link_to "Torrent", torrent_url_for(song.key) %> <%= link_to "Delete", "songs/delete/?song=" + song.key, :confirm => '¿Estás seguro de que deseas eliminar' + song.key + '?' %>

Ya que usaremos flotadores para diseñar esta página, debemos limpiarlos antes y después para asegurarnos de que el diseño no se arruine. Ahora agreguemos el CSS para ajustar el diseño de esas secciones:

 #sidebar ancho: 30%; flotador izquierdo;  #main ancho: 70%; flotador izquierdo;  a, a: visitó color: # 00f; texto-decoración: ninguno;  a: hover text-decoration: underline;  td relleno: 5px; 

La barra lateral será el 30% de la página y la sección principal será el 70% de la página. Además, hay CSS para eliminar el subrayado de los enlaces a menos que el mouse se desplace sobre él, y también se agrega un relleno al etiquetas para que no se vea tan apretado. Al final, ese es realmente el único CSS que necesitamos para darle a la página un diseño básico. Siéntase libre de agregar a esta aplicación todo el estilo que desee, ya que ciertamente hay maneras de hacer que esta aplicación se vea mejor.


Conclusión

Esperemos que ahora tenga una buena comprensión de cómo interactuar con Amazon S3 desde su aplicación Ruby on Rails. Con el aws-s3 gema, hacer esto es muy fácil, por lo que agregarlo a una aplicación existente tomará muy poco tiempo. Siéntase libre de modificar esta aplicación de la manera que desee para ver si puede mejorarla de alguna manera. Recuerde agregar su propia información de inicio de sesión de Amazon S3 y su constante de depósito a la aplicacion.rb archivo, de lo contrario la aplicación no se iniciará!

Para aquellos de ustedes que son expertos en Ruby on Rails, estoy seguro de que pueden encontrar una manera de optimizar esta aplicación aún más. Además, sería genial compartir las optimizaciones que realice en la sección de comentarios para que los lectores puedan aprovechar aún más este tutorial..