redirect_to,控制器和模型之间的关系

时间:2013-05-11 03:40:33

标签: ruby-on-rails

我生成了一个脚手架,它创建了一个看起来像这样的控制器(我删除了一些代码,但它仍然可以工作)。

  def create
    @post = Post.new(params[:post])

    if @post.save
      redirect_to @post
    end
  end

这会导致它重定向到/ posts / id ,这一切都正常。

但我不明白这是如何运作的。 @post是模型类的一个实例,那么它如何知道它应该重定向到哪个控制器和操作?我没有看到任何明确定义此关系的任何地方(在Post模型和PostsController之间)。

我试过从头开始复制这个没有脚手架,我得到错误,无法找到与我定义的模型相关联的url_for。即使我在resources中定义了routes.rb的路线。

2 个答案:

答案 0 :(得分:2)

当您致电redirect_to时,它会通过调用_compute_redirect_to_location方法

来计算路径

到达that method

中的else语句

并调用url_for方法reaches else

并致电polymorphic_path(和polymorphic_urlhere

此处convert_to_model(record) method has been called

record == @post

计算inflection您将reach else:singular

在您reach build_named_rout_call之后

并致电ActiveModel::Naming.singular_route_key(@post)。 您将获得['post']

route << routing_type(options)后,您的路线为['post', :url]

@post into argssend("post_url", args)放在与post_path(@post)

相同的位置

如果我在某处错了,我很抱歉。我希望这能让你理解redirect_to @post

答案 1 :(得分:0)

它仍然有效的原因,因为在你的控制器中Post创建方法仍然存在,这看起来很正常,也在你的routes.rb文件中你可能有类似资源的东西:帖子涵盖你的所有控制器动作,如帖子/ 1 /等等。另一件事是确保在编辑/更改routes.eb文件时重新启动服务器。希望这清楚到足以理解。