这是我的更新功能,当某些内容更新时,它完全转到http://localhost:3000/articles/2
def update
@article = Article.find(params[:id])
if @article.update(article_params)
redirect_to @article
else
render 'edit'
end
end
redirect_to @article
如何工作并显示artiles / 2 /页?
以下是我的路线
Prefix Verb URI Pattern Controller#Action
articles GET /articles(.:format) articles#index
POST /articles(.:format) articles#create
new_article GET /articles/new(.:format) articles#new
edit_article GET /articles/:id/edit(.:format) articles#edit
article GET /articles/:id(.:format) articles#show
PATCH /articles/:id(.:format) articles#update
PUT /articles/:id(.:format) articles#update
DELETE /articles/:id(.:format) articles#destroy
welcome_index GET /welcome/index(.:format) welcome#index
root GET / welcome#index
答案 0 :(得分:4)
神奇的方法是polymorphic_url
。
当您致电link_to
,redirect_to
等并且您没有传递字符串或路由选项的哈希值时,Rails最终会调用此方法。
Active Record(和Active Model兼容对象)有一个model_name
类方法,它返回一个ActiveMethod :: Name对象,该对象有一堆方法可以获得正确的'各种用途的模型类的名称。
其中一个(singular_route_key
)说明路线中的模型使用了什么名称。如果你在引擎中,这也会处理像命名空间这样的事情。
在最简单的情况下,归结为
@article.class.model_name.singular_route_key #=> 'article'
Rails然后通过将此连接与任何前缀选项和正确的后缀(' url','路径'等)相结合,从而生成方法名称,最后得到一个方法名称,如article_url
。然后它调用该方法(根据您的路由文件为您生成),传递文章,该文章返回本文的URL。
答案 1 :(得分:3)
redirect_to方法检查提供的实例类,并根据模型类和路径中提供的路径为您提供/ articles,然后检查对象是否具有id。如果对象在数据库中持久存在,那么它会检查该对象上的to_params方法并添加到/articles/{result of to_params}
。如果对象没有在数据库中保留,那么它会为您提供articles/new
。
答案 2 :(得分:2)
查看名称为article
-
article GET /articles/:id(.:format) articles#show
因此,当您提供类似redirect_to @article
的内容时,它会检查当前视图中的ID以获取ID并显示相应的记录视图。
<强>情境:强>
1)您在文章索引中显示了许多记录。
2)您在控制器中点击了其链接定义为redirect_to @article
的第二条记录。
3) 控制器非常智能,可以首先路由以识别路线,然后为其选择正确的路径。
4) 视图根据控制器转发的路由显示视图。
答案 3 :(得分:2)
在你的控制器中你有
@article = Article.find(params[:id])
redirect_to @article
因此@article
包含文章的ids
数组。您还有/articles/:id(.:format) articles#show
因此,每当更新特定Article
时,它都会根据:id
包含的@article
重新定位到相应的文章。
在您的情况下,您更新的文章包含id = 2
,因此路线为/artcles/2