2012-05-07 11 views
6

Przechodzę przez samouczek Michaela Hartla pod adresem . Jest to w zasadzie aplikacja na forum, w której użytkownicy mogą wysyłać wiadomości, a inni mogą zostawić odpowiedzi. Teraz tworzę Users. Wewnątrz UsersController rzeczy wyglądają tak:Używanie redirect_to z określonym obiektem ActiveRecord do utworzenia łącza do tego obiektu

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 

Autor mówi, że następujące linie są równoważne. Co ma sens do mnie:

@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 przekierowuje do show.html.erb. Jak dokładnie to działa? Skąd wiadomo, aby przejść do show.html.erb?

Odpowiedz

13

Wszystko to odbywa się dzięki magii rutynowego prowadzenia Rail. Konkretnie istnieje konwencja, że ​​wykonanie określonego obiektu trafia na stronę redirect_to dla tego obiektu. Rails wie, że @user jest aktywnym obiektem rekordowym, więc interpretuje to jako wiedząc, że chcesz przejść do strony show obiektu.

Oto kilka szczegółów z odpowiedniej części 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. 

Zasadniczo, stosując spokojny zasobów w pliku routes.rb daje „” do tworzenia skrótów URL bezpośrednio z obiektami ActiveRecord.

1

Gdy spojrzeć na source code z redirect_to, można zauważyć, że w końcu powróci redirect_to_full_url(url_for(options), status), próby wywołania funkcji url_for z obiektu, załóżmy, że masz obiekt jest @article, url_for (@article), powróci tak: „http://localhost:3000/articles/11”, to będzie nowy wniosek do tego adresu URL, a następnie w swojej trasy, można również sprawdzić trasy w konsoli według rodzaju:

rake routes

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

więc to dlaczego redirect_to @article wola iść SHOW działania i renderowanie w show.html.erb. Hope odpowiedziała na twoje pytanie.

Powiązane problemy