ruby-on-rails - 向 API::V1 模块控制器提交请求时无法验证 Railsauthentity_token
问题描述
我遇到了 Rails 5 的一个非常奇怪的问题。我有两个控制器,第一个 asusers_controller
和第二个 as api/v1/users_controller
。这两个控制器都有一个register
动作。我正在尝试向这两个控制器发布表单。此表单创建如下,
<%= form_tag('v2/register/user', {id: "add-user-form", class: "jiffle-form", role: "form"}) do%>
#form body
<%= submit_tag("Resigter", data: {i18n: "register"}, class: "btn btn-lg btn-block btn-blue", id: "add-user", type: "submit") %>
<% end %>
路线,
post "register" => "users#create", :as => "user_registeration_submit"
post "v2/register/user" => "api/v1/users#create"
当我使用/register
url 提交表单时,它会成功处理。但是,当我使用v2/register/user
url 提交表单时Can't verify CSRF token authenticity
出现错误。
参数
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"ADNTIp9alRB/ujRhkoqNuDkzdW6ANfcl/MbPjGLwVd6nwVuG5oi+uVhE9MeZo+1MeyKLbwZYNV31Vy/VH3M2bg==", "sfdc_token"=>"",
"email"=>"[FILTERED]", "first_name"=>"kjl", "last_name"=>"jk", "contact_no"=>"894892849", "company_name"=>"j", "title"=>"kj",
"internal_366vagan2"=>"", "consent"=>"true",
"commit"=>"Register"}
api/v1/users_controller
当我使用 ajax 在请求中使用X-CSRF-TOKEN标头提交表单时,它工作正常。
我在哪里进行更改以使我的 api/v1 控制器工作?
解决方案
你可以简单地写在 application_controller.rb
protect_from_forgery with: :exception, unless: -> { request.format.json? }
并在 routes.rb 文件中设置默认格式为 json
但更好的方法:
在您的情况下,您必须创建两个命名空间,一个用于处理 API 响应,另一个用于处理 FORM。相应地在 routes.rb 文件中使用命名空间。并且相应地还有两个不同的基本控制器,它们继承自 ApplicationController。
对于 API
class Api::V1::ApplicationController < ApplicationController
protect_from_forgery with: :exception, unless: -> { request.format.json? }
end
并在 routes.rb 文件中设置默认格式为 json
resources :tasks, defaults: {format: :json}
对于表格视图
使用默认设置,或
class Admin::AdminController < ApplicationController
protect_from_forgery with: :exception
end
#In this case, comment it from main application_controller.rb file:protect_from_forgery with: :exception
注意:这里 Admin 和 Api 是两个命名空间。而且 routes.rb 文件看起来像:
#For admin
namespace :admin do
end
#For Api
namespace :api do
scope module: :v1 do
end
end
希望它会工作:)
推荐阅读
- java - 如何根据行中的第二个元素对文本文件的每一行进行排序并填充到 ListView 中?
- javascript - 为什么在触摸设备中触发两次 am-charts 的点击事件?
- java - Java中解引用的定义
- flutter - 颤振模态表
- r - 我可以使用 R ggsurvplot 在我的 Kaplan Meier 图中更改 surv.median.line 的颜色吗?
- c - 有 4 个孩子的 fork 进程?
- java - 如何测试 Spring Batch 应用程序的整个流程?
- sql - 如何构造 SQL 查询以查找随时间变化的值
- perl - What does the if( $n ) do in the code below?
- c# - 如何将文件保存在 localStorage 中,然后在 mvc 中的服务器上发送