2012-05-07 25 views
6

Estoy repasando el tutorial de Michael Hartl al . Básicamente es una aplicación de tablero de mensajes donde los usuarios pueden publicar mensajes y otros pueden dejar respuestas. En este momento estoy creando Users. Dentro de las UsersController las cosas se ven de esta manera:Uso de redirect_to con un objeto ActiveRecord específico para crear un enlace a ese objeto

class UsersController < ApplicationController 
     def new 
     @user = User.new 
     end 

     def show 
     @user = User.find(params[:id]) 
     end 

     def create 
     @user = User.new(params[:user]) 
     if @user.save 
      flash[:success] = "Welcome to the Sample App!" 
      redirect_to @user 
     else 
      render 'new' 
     end  
     end 
    end 

El autor dice que las líneas siguientes son equivalentes. Lo cual tiene sentido para mí:

@user = User.new(params[:user]) 
    is equivalent to 
    @user = User.new(name: "Foo Bar", email: "[email protected]", 
      password: "foo", password_confirmation: "bar") 

redirect_to @user redirige a show.html.erb. ¿Cómo funciona eso exactamente? ¿Cómo sabe ir al show.html.erb?

Respuesta

13

Todo esto se maneja a través de la mágica ruta de descanso de Rail. Específicamente, existe la convención de que al hacer un redirect_to un objeto específico va a la página show para ese objeto. Rails sabe que @user es un objeto de registro activo, por lo que lo interpreta como saber que desea ir a la página de visualización del objeto.

aquí hay algo de detalle de la sección correspondiente de la Rails Guide - Rails Routing from the Outside In.:

# If you wanted to link to just a magazine, you could leave out the 
# Array: 

<%= link_to "Magazine details", @magazine %> 

# This allows you to treat instances of your models as URLs, and is a 
# key advantage to using the resourceful style. 

Básicamente, el uso de los recursos de descanso en su archivo routes.rb Gives You 'atajos' para crear URL de directamente de los objetos ActiveRecord.

1

Al echar un vistazo de la source code de redirect_to, se dará cuenta de que, finalmente, volverá redirect_to_full_url(url_for(options), status), intenta llamar a la función url_for con un objeto, supongamos que tiene un objeto es @ article, url_for (@ article), volverá así: "http://localhost:3000/articles/11", eso es que será una nueva solicitud a esta dirección URL, a continuación, en su enrutamiento, también se puede comprobar las rutas en la consola por tipo de:

rake routes

article GET /articles/:id(.:format) articles#show

así que por eso la redirect_to @article voluntad para ir SHOW acción y render en show.html.erb. Hope respondió tu pregunta.

Cuestiones relacionadas