redirect_to方法如何在ruby中工作

时间:2014-04-15 11:43:20

标签: ruby-on-rails ruby

这是我的更新功能,当某些内容更新时,它完全转到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

4 个答案:

答案 0 :(得分:4)

神奇的方法是polymorphic_url

当您致电link_toredirect_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