Api :: V1 :: UsersController #create中的ActionController InvalidAuthenticityToken

And*_*Dev 5 ruby android ruby-on-rails

我将使用Ruby on Rails创建restful API.我想创建,删除,显示和更新数据.所有这些都必须是JSON才能在Android设备中获得它.我也在使用Postman检查我的API.这就是我所做的:

我的控制器:

class Api::V1::UsersController < ApplicationController
    respond_to :json

    def show
        respond_with User.find(params[:id])
    end

    def create
        user=User.new(user_params)
        if user.save
            render json: user, status: 201
        else
            render json: {errors: user.errors}, status: 422
        end
    end

    def update
        user=User.find(params[:id])
        if user.update(user_params)
            render json: user, status:200
        else
        render json: {erros: user.errors},status: 422
        end

    end

    def destroy
        user=User.find(params[:id])
        user.destroy
        head 204
    end

    private
    def user_params
        params.require(:user).permit(:email,:password,:password_confirmation)
    end
end
Run Code Online (Sandbox Code Playgroud)

这是我的路线档案:

Rails.application.routes.draw do
  devise_for :users
  namespace :api, defaults:{ format: :json } do
    namespace :v1 do
    resources :users, :only=>[:show,:create,:update,:destroy]   
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

并在我的Gemfile中添加了以下代码:

gem "devise"
gem 'active_model_serializers'
Run Code Online (Sandbox Code Playgroud)

我不知道为什么当我想通过邮递员创建时,我收到以下错误:

ActionController InvalidAuthenticityToken in Api::V1::UsersController#create
Run Code Online (Sandbox Code Playgroud)

Dee*_*ale 6

您需要在application_controller.rb中进行以下更改

更改

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
end
Run Code Online (Sandbox Code Playgroud)

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :null_session
end
Run Code Online (Sandbox Code Playgroud)

编辑

更好的方法是跳过特定控制器的身份验证

class Api::V1::UsersController < ApplicationController
  skip_before_action :verify_authenticity_token

  respond_to :json
  # ...
end
Run Code Online (Sandbox Code Playgroud)