IIC2143-2020-1 / proyecto

Repositorio para el proyecto semestral de IIC2143 Ingeniería de Software 2020-1
22 stars 8 forks source link

Duda ayudantía asociaciones - ruta sin vista correspondiente #137

Closed dlisidoraguelfand closed 4 years ago

dlisidoraguelfand commented 4 years ago

Hola! Estoy leyendo la ayudantía de asociaciones, ya que tengo que hacer algo muy parecido a la asociación Playlists-Songs para el proyecto. No entiendo como funcionan las últimas rutas, porque no hay vistas correspondientes. No sé si tiene que ver con como Scaffold construye las vistas, yo no lo usé. get 'playlists/:id/songs-to-add', to: 'playlists#song_list', as: :playlist_song_list get 'playlists/:id/add/:song_id', to: 'playlists#add_song', as: :add_playlist_song

elramirezv commented 4 years ago

Hola @dlisidoraguelfand !

A modo de contexto, si te fijas en la declaración de cada ruta, en la parte que dice to: playlist#<algo>, lo que viene después del "#" es el método del controlador (en este caso playlist) al cual "relacionamos" la ruta. En el controlador playlist verás los métodos:

  def song_list
  end

  def add_song
    @playlist.songs << @song
    redirect_to playlist_path(@playlist)
  end

Ahora bien, respecto a tu pregunta, la verdad es que si tienen una vista. Si corres la app y vas a la ruta /playlists/<id>/songs-to-add verás lo que se renderea en: playlists/song_list.html.erb. (Primera ruta que mencionas)

Respecto a la segunda, si inspeccionas el html de esta misma ruta en el navegador, verás algo como esto:

<tr>
    <td>Canción 1</td>
    <td>Albúm</td>
    <td>Artista</td>
    <td><a href="/playlists/1/add/1">Add to playlist</a></td>
</tr>

Si te fijas, el último elemento tiene un link a /playlists/1/add/1, el cual es generado gracias a<%= link_to 'Add to playlist', add_playlist_song_path(@playlist, song) %>.

Quiere decir que cuando hagas click en él, te llevará a /playlists/1/add/1, el cual te llevará al método del controlador y este hace un redirect_to playlist_path(@playlist). Por lo tanto, te lleva nuevamente a /playlists/1.

Finalmente, y a modo de aclaración, no es necesario que todos los métodos estén asociados directamente a una vista en particular, pueden simplemente ser un paso "intermedio" para realizar una acción dentro de tu aplicación.

Espero que se haya entendido 😄

dlisidoraguelfand commented 4 years ago

Hola! Muchas gracias. Lo que no entiendía y sigo sin entender es por qué si voy a playlists/:id/songs-to-add se renderea playlists/song_list.html.erb, si el método asociado del controlador no redirecciona a ninguna vista.

elramirezv commented 4 years ago

Porque ahí entra la "magia" de Rails 😅. Por convención, si no retornas "nada" (entrecomillas porque si estás retornando algo) Rails irá a buscar alguna vista dentro de la carpeta que tenga el mismo nombre del controlador (playlists) y el mismo nombre del método (song_list).

dlisidoraguelfand commented 4 years ago

Perfecto, no sabía, muchas gracias!