繁体   English   中英

如何使用 Webpack 在 Rails 6 中提交 ajax 表格? 获取 ActionController::InvalidAuthenticityToken 错误

[英]How to submit ajax form in Rails 6 with Webpack? Getting ActionController::InvalidAuthenticityToken error

全部!

我正在关注 GoRails 上有关如何使用操作电缆制作聊天应用程序的视频。 在视频中,我相信正在使用 Rails 5,但是,我想在 Rails 6 上进行尝试。

到目前为止一切都很顺利。 安装了 Bootstrap 和 jQuery 并正确配置了我的environments.js文件。 太棒了。 然后我在添加动作电缆之前进入部分,我们将聊天室表单设置为远程:true。

我无法弄清楚为什么我的表单仍试图提交为 HTML 而不是 JS。 最重要的是,我收到了ActionController::InvalidAuthenticityToken错误。

这是我设置表单的方式:

<%= simple_form_for [@chatroom, Message.new], remote: true, html: { id: 'message-input' } do |f| %>
  <%= f.input :body, label: false, input_html: { rows: 1, autofocus: true } %>
<% end %>

当我提交时,我在我的 Rails 服务器中收到此错误:

Started POST "/chatrooms/1/messages" for ::1 at 2019-10-16 21:02:01 -0500
Processing by MessagesController#create as HTML
  Parameters: {"message"=>{"body"=>"test3"}, "chatroom_id"=>"1"}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms | Allocations: 968)



ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:

Started POST "/__better_errors/cf3c4e5c6fa2d1b1/variables" for ::1 at 2019-10-16 21:02:01 -0500

不知道该怎么办。 我用谷歌搜索并遇到了这个,但我不确定它是否完全适用: 在 JS 模块中使用 Rails-UJS(带有 webpacker 的 Rails 6)

任何帮助将不胜感激!

当请求POST请求时,rails 会进行authenticity_token检查。

在来自 javascript 的请求中,您需要添加 header: 'X-CSRF-Token': csrfToken

您可以使用以下 JS 获取csrfToken

const csrfToken = document.querySelector('[name="csrf-token"]').getAttribute('content');

另一种解决方案是禁用verify_authenticity_token ,您可以将其添加到application_controller.rb以禁用它,或者您可以将其添加到 controller 特定:

skip_before_action :verify_authenticity_token

所以,事实证明我必须使用form_with而不是form_for才能让它作为 JS 处理。 我猜form_for正在减慢被弃用?

我的表格现在看起来像这样:

<%= form_with(model: [@chatroom, Message.new]) do |f| %>
  <%= f.text_field :body %>
<% end %>

并且 output 是我所期望的,而不必使用 JS 提交 CSRF 令牌或跳过 controller 中的之前操作。

Started POST "/chatrooms/1/messages" for ::1 at 2019-10-18 20:15:14 -0500
Processing by MessagesController#create as JS
  Parameters: {"authenticity_token"=>"xPBQ+4LOS5aMa7PQ3HEGXAMX6wIIEfQ0Izy/xUqUtleK4mB18IYxC4mOcIoiS5M+FGm6J/WEYMdbM4IVPojScw==", "message"=>{"body"=>"test 5"}, "chatroom_id"=>"1"}
  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Chatroom Load (0.3ms)  SELECT "chatrooms".* FROM "chatrooms" WHERE "chatrooms"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/messages_controller.rb:19:in `set_chatroom'
   (0.1ms)  BEGIN
  ↳ app/controllers/messages_controller.rb:12:in `create'
  Message Create (0.7ms)  INSERT INTO "messages" ("chatroom_id", "user_id", "body", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["chatroom_id", 1], ["user_id", 1], ["body", "test 5"], ["created_at", "2019-10-19 01:15:14.619853"], ["updated_at", "2019-10-19 01:15:14.619853"]]
  ↳ app/controllers/messages_controller.rb:12:in `create'
   (5.6ms)  COMMIT
  ↳ app/controllers/messages_controller.rb:12:in `create'
Redirected to http://localhost:3000/chatrooms/1
Completed 200 OK in 17ms (ActiveRecord: 7.6ms | Allocations: 4690)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM