Ruby on Rails - redirect_to' index'之间的区别和redirect_to objects_path& redirect_to action:' index'

时间:2016-10-12 14:36:48

标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller controller

我有一个简单的模型和控制器。让我们以新西兰人为例:

codesign -d -v --entitlements - "$BINARY_PATH"

我在索引页面上使用删除链接。当我使用redirect_to' index'页面不刷新模型。我必须在页面上进行一次硬刷新才能删除Kiwi。但是,如果我使用redirect_to动作:' index'或redirect_to kiwis_path页面将在destroy动作后更新。我似乎无法找到解释。任何人都可以对这个问题有所了解。

2 个答案:

答案 0 :(得分:3)

简短回答

建议在大多数情况下使用指定的路线助手。在您的情况下,正确的做法是redirect_to kiwis_path

答案很长

当您调用redirect_to时,Rails将以302(重定向)状态响应当前请求,然后客户端(即您的浏览器)将另一个请求发送到指定位置。重定向的位置由您传递给redirect_to的参数确定。

当您将String传递给redirect_to时,必须成为一个网址(包含协议和主机,例如" http://localhost:3000/kiwis&#34 ;或者没有,例如" / kiwis")

在您的情况下redirect_to kiwis_path是正确的。它相当于redirect_to '/kiwis'

传递哈希参数action: 'index'时,url_for方法用于生成URL。

redirect_to action: 'index'redirect_to url_for(action: 'index')相同。 url_for(action: 'index')将匹配路径/kiwis的路线。

因此redirect_to action: 'index'相当于redirect_to '/kiwis'redirect_to kiwis_path

Here您可以阅读redirect_to接受的不同论点及其处理方式。

redirect_to 'index'会怎样?

我已设置测试控制器/操作以使用redirect_to 'index'重定向。让我们看一下使用curl向它发出请求时会发生什么。

~/projects/gitlab $ curl -v -H "Accept: text/html" http://localhost:3000/redirect_test

我省略了输出中一些不相关的部分:

> GET /select_options HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.43.0
> Accept: text/html
>
< HTTP/1.1 302 Moved Temporarily
< X-Frame-Options: ALLOWALL
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Location: http://localhost:3000index      <----- That is not what we want!

您可以在显示的最后一行看到Location标头的值不是所需的URL。当我在Chrome中测试时,请求在遇到此错误重定向时被取消。因此浏览器停留在同一页面上并且没有导航。这可以解释为什么你必须做一个&#34;硬刷新&#34;查看页面上的更改。

答案 1 :(得分:0)

redirect_to 'index'不是有效代码。 您需要为redirect_to指定完整路径。

您可能会将这与有效代码render 'index'混淆。