Rails Rails 7 中 turbo_stream 的问题

wdrsam · 2022年08月06日 · 最后由 qichunren 回复于 2022年08月07日 · 338 次阅读

在用 Devise 时,退出的路由是 Delete,于是用 turbo-method 指定了 Delete 的请求方式。但请求 format 也变为了 Delete。在请求了 Devise 的退出登录的路由后

Started DELETE "/users/sign_out" for ::1 at 2022-08-06 22:45:15 +0800
Processing by Users::SessionsController#destroy as TURBO_STREAM
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
Redirected to http://localhost:3000/
Completed 302 Found in 7ms (ActiveRecord: 0.5ms | Allocations: 2075)


Started DELETE "/" for ::1 at 2022-08-06 22:45:15 +0800

ActionController::RoutingError (No route matches [DELETE] "/"):

可以看到,得到了 302 的 status 后,它去请求了我指定的退出登录的 path,也就是根目录,但它同样带着 Delete 方式去请求。

仅仅是退出登录,我应该不需要写一个 turbo_frame 把 header 那块替换掉吧?而且不知道为何它还要去用 Delete 方式请求一次"/"

我唯一正确的处理方式就是:将 header 那块内容包在 turbo_frame 里。然后退出登录后,将显示"Sign in" 和 "Sign out"显示,并替换原本显示用户名的元素。

是这样吗?感觉新的这个 turbo 和传统的思路不太一样。

这个网络上大把答案 搜下就有了

xianyuit 回复

问题是解决了,我用 button_to 就没有多余的请求了。但不太知道为什么 link_to 用 turbo 模拟 delete 请求,会导致有额外的一个 delete '/'的请求出现。

wdrsam 回复

我大概明白了。这个不是 Turbo 本身的原因,原因是由于 Turbo 使用了 内置的 Fetch API,它遵循的是 http 规范的。而 button_to 创建的是一个 http method 为 post 请求的表单请求。

303 状态能保证总是采用 GET 请求的,而 302 重定向时不改变方法的

所以解决办法是:想办法让登出方法返回 303 的状态码;或者使用 button_to。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号