9

我正在阅读 Michael Hartl 在http://ruby.railstutorial.org/上的教程。它基本上是一个留言板应用程序,用户可以在其中发布消息,其他人可以留下回复。现在我正在创建Users. 里面的UsersController东西是这样的:

    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

作者说以下几行是等价的。这对我来说很有意义:

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

redirect_to @user重定向到show.html.erb. 这究竟是如何工作的?它怎么知道去show.html.erb

4

3 回答 3

16

这一切都是通过 Rail 的宁静路由的魔力来处理的。具体来说,有一个约定,即执行redirect_to特定对象会转到该show对象的页面。Rails 知道这@user是一个活动记录对象,因此它将其解释为知道您想进入该对象的显示页面。

这是 Rails 指南的适当部分的一些细节- 从外到内的 Rails 路由。

# 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.

基本上,在文件中使用 restful 资源为您routes.rb提供了直接从 ActiveRecord 对象创建 url 的“快捷方式”。

于 2012-05-07T01:34:30.993 回答
2

看一下源码redirect_to你会注意到最后,它会返回redirect_to_full_url(url_for(options), status),try to call the url_forfunction with a object,假设你有一个对象是@article,url_for( @article ),它会返回如下: “ http://localhost:3000/articles/11 ”,这将是对该 URL 的新请求,然后在您的路由中,您还可以通过键入以下内容在控制台中检查路由:

rake routes

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

所以这就是为什么redirect_to @articleSHOW采取行动并渲染的原因show.html.erb。希望回答了你的问题。

于 2017-10-12T18:26:49.053 回答
-4

我建议阅读有关资源路由http://guides.rubyonrails.org/routing.html的信息。

于 2012-05-07T01:32:42.850 回答