Rails“status”:“422”,“error”:“Unprocessable Entity”

时间:2015-03-12 20:02:12

标签: ruby-on-rails json

我想使用Json将一些数据从移动应用程序添加到我的rails应用程序,它运行正常,如果我使用GET方法但是当我使用POST方法设置它时它会给出错误" status": " 422","错误":"不可处理的实体"。

路线是

resources :photomsgs, :defaults => { :format => 'json' }

我的控制器

def create
  @photomsg = Photomsg.new(photo_params)

 respond_to do |format|
  if @photomsg.save
    format.json { render json: @photomsg, status: :created }
    format.xml { render xml: @photomsg, status: :created }
  else
    format.json { render json: @photomsg.errors, status: :unprocessable_entity }
    format.xml { render xml: @photomsg.errors, status: :unprocessable_entity }
  end
end
end 

  def photo_params
    params.require(:photomsg).permit(:title, :physician, :patient)
  end

我正在使用这个Json网址 - http://infinite-depths-5848.herokuapp.com/photomsgs

7 个答案:

答案 0 :(得分:5)

这篇文章已经有一段时间了,但我今天偶然发现了它,因为我在给json端点发帖时遇到了类似的错误。我将在这里发布解决方案以帮助其他人。

发生这种情况时日志中的错误是ActionController :: InvalidAuthenticityToken ....

为了解决这个问题,我补充道:

  

skip_before_action:verify_authenticity_token,if :: json_request?

位于控制器的顶部,并按如下方式定义了json_request方法:

  

保护

     

def json_request?       request.format.json?
   端

答案 1 :(得分:3)

如@ joe-van-dyk所说,它看起来像某种验证错误。

以这种方式继续,使用byebug调试代码并在模型上查找错误消息。

def create
  @photomsg = Photomsg.new(photo_params)

 respond_to do |format|
  if @photomsg.save
    format.json { render json: @photomsg, status: :created }
    format.xml { render xml: @photomsg, status: :created }
  else
    byebug
    # => @photomsg.errors.messages
    format.json { render json: @photomsg.errors, status: :unprocessable_entity }
    format.xml { render xml: @photomsg.errors, status: :unprocessable_entity }
  end
end
end 

  def photo_params
    params.require(:photomsg).permit(:title, :physician, :patient)
  end

答案 2 :(得分:0)

检查您的验证并确保您发布的数据符合这些验证。

答案 3 :(得分:0)

检查你的Photomsg模型。当我将ActiveRecord关联用于不存在的表(可能是拼写错误)时,我得到了同样的错误。

例如,请考虑以下表格 enter image description here

以下型号代码

class User < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  belongs_to :user
  belongs_to :author
end

注意在Post模型中我引用了Author模型,但posts表没有author_id列。当您尝试使用Post模型创建条目时,rails会抛出错误&#34; 422 Unprocessable Entity&#34;。只需删除不存在的belongs_to关联就可以解决问题。

答案 4 :(得分:0)

将用户身份验证令牌作为标题格式发送到网络服务httppost.setHeader("Authorization:", token);

答案 5 :(得分:0)

就我而言,来自rails的AJAX调用正在发生。我在application.js document.ready函数中将其包含在内,以解决此问题。

$.ajaxSetup({
        headers:
            { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }
    });

答案 6 :(得分:0)

此问题与csrf令牌有关。 csrf令牌主要用于保护无效的表单提交,这样用户将无法从Rails应用程序外部提交表单数据。

有两种方法可以解决此问题。

选项1:从当前控制器中删除csrf验证。

skip_before_action :verify_authenticity_token

在控制器中添加以上代码将跳过控制器中的csrf检查。但是不建议这样做,因为如果您使用此选项,请确保任何人都可以从rails应用程序外部提交数据事件。

选项2:在您的请求中添加CSRF令牌。 解决此问题的另一种方法是,您可以在自定义表单上或ajax请求中添加csrf令牌。

步骤:1如果您不使用任何布局,则可以使用以下代码在表单中简单地添加csrf。如果您使用的是布局,请确保默认检查head Rails,然后在head中添加csrf。

<%= csrf_meta_tags %>

如果您不使用布局,此代码将添加csrf令牌。

步骤:2在您的ajax请求中,添加以下代码。

 $.ajax({
       type: "post", 
       beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
       url: "/form_submit/<%= @form.id %>" ,
       data: form_data, 
       success: function(data, textStatus, jqXHR){ 
          console.log("this is success");
       },
       error: function(jqXHR, textStatus, errorThrown){

       }
     });