2014-11-24 5 views
17

मैं ब्रांड नाम के बारे में ट्वीट करने के लिए उपयोगकर्ताओं को अपनी वेबसाइट "अंक" या "क्रेडिट" पर देने की कोशिश कर रहा हूं।पोस्ट 422 (अप्राप्य इकाई)? मार्ग या नियंत्रक के कारण?

मैं उचित दृश्य पर फैंसी चहचहाना विजेट है ...

<p><a href="https://twitter.com/share" class="twitter-share-button" data-text="Check Out This Awesome Website Yay" data-via="BrandName" data-hashtags="ProductName">Tweet</a> 
<div id="credited"></div> 
<script>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")); 
</script>  

मैं जे एस सब लिखा है और बहुत ....

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); 
    }); 
}); 

अब समस्या या तो में है नियंत्रक या मार्गों में (जहां मैं पोस्ट कर रहा हूं)। मुझे लगता है कि मार्ग ठीक हैं क्योंकि पोस्ट लगभग काम कर रहा है, क्योंकि यह विकिपीडिया पर त्रुटि का वर्णन है - "422 अनप्रचारनीय इकाई (वेबडीवीवी; आरएफसी 4918) अनुरोध अच्छी तरह से गठित किया गया था लेकिन अर्थपूर्ण के कारण इसका पालन करने में असमर्थ था त्रुटियों। "

तो, क्या आप लोग नियंत्रक में अपने रूबी कोड के साथ कुछ भी गलत देखते हैं?

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 अनुरोधों के बारे में स्मैक नहीं जानता।

+0

आईएमई रेल आमतौर पर 422 लौटाता है जब ActiveRecord ऑब्जेक्ट अद्यतन/सहेजने में विफल रहता है। आपका लॉग क्या कहता है? – ihaztehcodez

+0

ऐसा लगता है .... 127.0.0.1 के लिए 2014-11-24 00:34:53 -0500 सोशल क्रेडिट क्रेडिट नियंत्रक द्वारा प्रसंस्करण # क्रेडिट_टविट */* सीएसआरएफ टोकन प्रामाणिकता को सत्यापित नहीं कर सकता 1ms एक्शनकंट्रोलर :: अमान्य प्रमाणीकरण टोकन - एक्शनकंट्रोलर :: अमान्य प्रमाणीकरण टोकन: – piratetone

+0

क्या आप रेल सर्वर से लॉग को पोस्ट कर सकते हैं जो इस त्रुटि को दिखाते हैं? साथ ही, आपके पास दो मार्ग 'get' और 'post' क्यों एक ही विधि को इंगित करते हैं? – Surya

उत्तर

38

मुझे यह काम मिल गया!

मैं नियंत्रक करने के लिए एक ...

skip_before_action :verify_authenticity_token 

गयी।

समस्या को जांचते समय यह पाया गया कि सीएसआरएफ टोकन सत्यापित नहीं किया जा सका।

+9

आप एक समाधान के लिए [इस सवाल] (http://stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails) को भी देखना चाहते हैं, जिसके लिए csrf को अक्षम करने की आवश्यकता नहीं है टोकन चेक – ihaztehcodez

+0

धन्यवाद @ihaztehcodez - इस skip_before_action: verify_authenticity_token एक नियंत्रक में हस्ताक्षर किए जाने के बाद उपयोगकर्ताओं के लिए आवश्यक है कि पर केवल प्रयोग किया जाता है वहाँ किसी भी प्रमुख कारण कारण है कि मैं इस छोटे से टुकड़ा से अधिक है कि लिंक पर प्रदान किए अजाक्स समाधान का उपयोग कर सकते हैं।? – piratetone

+8

@piratetone: हाँ, यही कारण है कि सुरक्षा है। – Surya

1

उसी समस्या का सामना करना पड़ा। verify_authenticity_token

अपने नियंत्रक जहाँ आपके जे एस कॉल करने या डेटा भेज रहा है के शीर्ष पर

: यह

skip_before_action जोड़ने के बाद ठीक कर लेगा।

class UserController < ApplicationController 
    skip_before_action :verify_authenticity_token 
    def create 
    end 
end 

जैसा कि कोड स्निपेट में दिखाया गया है।

संबंधित मुद्दे