我想使用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
答案 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关联用于不存在的表(可能是拼写错误)时,我得到了同样的错误。
以下型号代码
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){
}
});