将redirect_to与特定的ActiveRecord对象一起使用以创建指向该对象的链接

时间:2012-05-07 01:25:33

标签: ruby-on-rails

我正在http://ruby.railstutorial.org/阅读Michael Hartl的教程。它基本上是一个留言板应用程序,用户可以发布消息,其他人可以留下回复。现在我正在创建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

3 个答案:

答案 0 :(得分:13)

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

以下是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.

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

答案 1 :(得分:1)

当您查看redirect_to的{​​{3}}时,您会注意到,最后,它会返回redirect_to_full_url(url_for(options), status),尝试使用对象调用url_for函数,假设你有一个对象是 @article ,url_for(@article),它会像这样返回:&#34; source code&#34;,那将是一个对此URL的新请求,然后在您的路由中,您还可以通过键入以下内容来检查控制台中的路由:

  

rake routes

     

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

这就是为什么redirect_to @articleSHOW行动,并在show.html.erb中呈现的原因。希望回答了你的问题。

答案 2 :(得分:-3)

我建议阅读资源路由http://guides.rubyonrails.org/routing.html