首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当向API::V1模块控制器提交请求时,无法验证Rails authenticity_token

当向API::V1模块控制器提交请求时,无法验证Rails authenticity_token
EN

Stack Overflow用户
提问于 2019-04-27 11:17:23
回答 1查看 57关注 0票数 0

Rails 5遇到了一个非常奇怪的问题,我有两个控制器,一个是users_controller,另一个是api/v1/users_controller。这两个控制器都有一个register操作。我正试着把一份表格寄给这两个控制器。此表单如下所示,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <%= 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 %>

Routes

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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错误。

Params

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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"}

当我使用ajax将表单提交给请求中带有X-CSRF-TOKEN头的api/v1/users_controller时,它工作得很好。

在哪里进行更改以使api/v1控制器工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-27 11:40:51

您可以简单地用application_controller.rb编写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   protect_from_forgery with: :exception, unless: -> { request.format.json? }

并在routes.rb文件中设置默认格式为json。

但更好的办法是:

在您的示例中,您必须创建两个名称空间,一个用于处理API响应,另一个用于表单处理。相应地在routes.rb文件中使用命名空间。并相应地从ApplicationController继承了两个不同的基本控制器。

对于API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Api::V1::ApplicationController < ApplicationController
   protect_from_forgery with: :exception, unless: -> { request.format.json? }
end

并在routes.rb文件中设置默认格式为json。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 resources :tasks, defaults: {format: :json}

表格视图

使用bydefault设置,或

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#For admin
namespace :admin do

end 

#For Api
namespace :api do
    scope module: :v1 do

    end
end 

希望它能奏效:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55884040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文