2

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

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

    if @post.save
      redirect_to @post
    end
  end

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

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

我已经尝试在没有脚手架的情况下从头开始复制它,但我收到了关于无法找到url_for与我定义的模型相关联的错误。即使我确实用resourcesin定义了路线routes.rb

4

2 回答 2

2

当您调用它时,通过调用方法redirect_to计算路径_compute_redirect_to_location

并达到该方法else中的语句

并调用到达url_for的方法。else

并在此处调用polymorphic_path(和polymorphic_url)。

这里convert_to_model(record) 方法已被调用

在哪里record == @post

计算inflection你将达到else的,它是:singular

到达build_named_rout_call

并调用ActiveModel::Naming.singular_route_key(@post)。你会得到['post']

route << routing_type(options)你的路线是['post', :url]

@post放入args并发送(“ post_url ”,args),与post_path(@post)

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

于 2013-05-11T05:38:34.760 回答
0

它仍然有效的原因是因为在您的控制器中 Post create 方法仍然存在,这对我来说看起来很正常,并且在您的 routes.rb 文件中您可能有类似资源的东西:包含所有控制器操作的帖子,例如 posts/1/ 等. 另一件事是确保在编辑/更改您的 routes.eb 文件时重新启动服务器。希望这足够清楚,可以理解。

于 2013-05-11T04:54:03.377 回答