Rails中的POST 422(不可处理的实体)? 由于路线或控制器?

我正试图在我的网站上为用户提供“积分”或“积分”来发布有关品牌名称的推文。

我在适当的视图上有花哨的推特小部件……

window.twttr = (function (d, s, id) { var t, js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src= "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); return window.twttr || (t = { _e: [], ready: function (f) { t._e.push(f) } }); }(document, "script", "twitter-wjs"));

我把JS写得很漂亮….

 function creditTweet() { $.post( "/credit_tweet", {}, function(result) { var text; if (result.status === "noop") { text = "Thanks for sharing already!"; } else if (result.status === "ok") { text = "5 Kredit Added"; } $("#credited").html(text); } ); } $(function() { twttr.ready(function (twttr) { window.twttr.events.bind('tweet', creditTweet); }); }); 

现在问题出在控制器或路由中(我发布的地方)。 我认为路由很好,因为POST几乎正常工作,因为这是维基百科上的错误描述 – “422 Unprocessable Entity(WebDAV; RFC 4918)请求格式正确但由于语义错误而无法遵循“。

那么,你们在控制器中看到我的ruby代码有什么问题吗?

 class SocialKreditController < ApplicationController TWEET_CREDIT_AMOUNT = 5 def credit_tweet if !signed_in? render json: { status: :error } elsif current_user.tweet_credited Rails.logger.info "Not crediting #{ current_user.id }" render json: { status: :noop } else Rails.logger.info "Crediting #{ current_user.id }" current_user.update_attributes tweet_credited: true current_user.add_points TWEET_CREDIT_AMOUNT render json: { status: :ok } end end end 

在我的routes.rb中,它非常直接,所以我怀疑这里有什么不对…

  get 'social_kredit/credit_tweet' post '/credit_tweet' => 'social_kredit#credit_tweet' 

哪里哦这个错误在哪里? 我显然不知道有关HTTP请求的信息。

我搞定了!

我加了……

 skip_before_action :verify_authenticity_token 

到控制器。

检查日志并发现无法validationCSRF令牌时发现了该问题。

我面临同样的问题。 添加后它会排除

skip_before_action:verify_authenticity_token

在您的控制器顶部,您的JS正在调用或发送数据。

 class UserController < ApplicationController skip_before_action :verify_authenticity_token def create end end 

如代码段所示。