我生成了一个脚手架,它创建了一个看起来像这样的控制器(我删除了一些代码,但它仍然可以工作)。
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
的路线。
答案 0 :(得分:2)
当您致电redirect_to
时,它会通过调用_compute_redirect_to_location
方法
else
语句
并调用url_for
方法reaches else
。
并致电polymorphic_path
(和polymorphic_url
)here。
此处convert_to_model(record)
method has been called。
计算inflection
您将reach else
及:singular
在您reach build_named_rout_call
之后
并致电ActiveModel::Naming.singular_route_key(@post)
。
您将获得['post']
在route << routing_type(options)
后,您的路线为['post', :url]
将@post
into args
和send("post_url", args)放在与post_path(@post)
如果我在某处错了,我很抱歉。我希望这能让你理解redirect_to @post
。
答案 1 :(得分:0)
它仍然有效的原因,因为在你的控制器中Post创建方法仍然存在,这看起来很正常,也在你的routes.rb文件中你可能有类似资源的东西:帖子涵盖你的所有控制器动作,如帖子/ 1 /等等。另一件事是确保在编辑/更改routes.eb文件时重新启动服务器。希望这清楚到足以理解。