微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

422不可处理的实体Ruby on Rails ReactJS

如何解决422不可处理的实体Ruby on Rails ReactJS

我正在尝试使用 axios 发送发布请求,但一直收到此错误

VM679:1 POST http://localhost:3000/api/v1/reviews 422(不可处理实体)

我在处理仅支持 Rails 6 API 的应用程序时遇到了这个挑战。

Ruby 版本:ruby 2.6.6p146 导轨:6.1.1 ReactJS

来自终端的错误消息:

    Started POST "/api/v1/reviews" for ::1 at 2021-03-05 19:08:59 +0100
Processing by Api::V1::ReviewsController#create as HTML
  Parameters: {"review"=>{"title"=>"vvdv","description"=>"vdfdf"},"currency_id"=>2}
  Currency Load (7.1ms)  SELECT "currencies".* FROM "currencies" WHERE "currencies"."id" = $1 LIMIT $2  [["id",2],["LIMIT",1]]
  ↳ app/controllers/api/v1/reviews_controller.rb:29:in `currency'
Completed 422 Unprocessable Entity in 117ms (Views: 0.8ms | ActiveRecord: 7.1ms | Allocations: 2200)

这是代码

反应

import React,{ useState,useEffect,Fragment } from "react";
import axios from "axios";
import Header from "./Header";
import styled from "styled-components";
import ReviewForm from "./ReviewForm";

const Wrapper = styled.div`
  margin-left: auto;
  margin-right: auto;
`;

const Column = styled.div`
  background: #fff;
  max-width: 50%;
  width: 50%;
  float: left;
  height: 100vh;
  overflow-x: scroll;
  overflow-y: scroll;
  overflow: scroll;
  &::-webkit-scrollbar {
    display: none;
  }
  &:last-child {
    background: black;
    border-top: 1px solid rgba(255,255,0.5);
  }
`;

const Main = styled.div`
  padding-left: 60px;
`;

export const Currency = (props) => {
  const [currency,setCurrency] = useState({});
  const [review,setReview] = useState({});
  const [loaded,setLoaded] = useState(false);

  useEffect(() => {
    const slug = props.match.params.slug;
    const url = `/api/v1/currencies/${slug}`;

    axios
      .get(url)
      .then((response) => {
        setCurrency(response.data);
        setLoaded(true);
      })
      .catch((response) => console.log(response));
  },[]);

  const handleChange = (e) => {
    e.preventDefault();

    setReview(Object.assign({},review,{ [e.target.name]: e.target.value }));

    console.log("review:",review);
  };

  const handleSubmit = (e) => {
    e.preventDefault();

    const csrftoken = document.querySelector("[name=csrf-token]").content;
    axios.defaults.headers.common["X-CSRF-TOKEN"] = csrftoken;

    const currency_id = parseInt(currency.data.id);
    axios
      .post("/api/v1/reviews",{ review,currency_id })
      .then((response) => {
        debugger;
      })
      .catch((response) => {});
  };

  return (
    <Wrapper>
      {loaded && (
        <Fragment>
          <Column>
            <Main>
              <Header
                attributes={currency.data.attributes}
                reviews={currency.included}
              />
            </Main>
            <div className="review"></div>
          </Column>
          <Column>
            <ReviewForm
              handleChange={handleChange}
              handleSubmit={handleSubmit}
              attributes={currency.data.attributes}
              review={review}
            />
          </Column>
        </Fragment>
      )}
    </Wrapper>
  );
};

export default Currency

控制器

module Api
  module V1
    class ReviewsController < ApplicationController
      protect_from_forgery with: :null_session

      def create
        review = currency.reviews.new(review_params)

        if review.save
          render json: ReviewSerializer.new(review).serialized_json
        else
          render json: { error: review.errors.full_messages },status: 422
        end
      end

      def destroy
        review = review.find_by(:id)

        if review.destroy
          head :no_content
        else
          render json: { error: review.errors.full_messages },status: 422
        end
      end

      private

      def currency
        @currency ||= Currency.find(params[:currency_id])
      end

      def review_params
        params.require(:review).permit(:title,:description,:rating,:currency_id)
      end
    end
  end
end

解决方法

您能否尝试将 if review.valid? 放在 if review.save 之前,看看是否会收到验证异常?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?