2013-03-07 9 views
11

मेरे पास एक रेल 3.1 ऐप है जो पेपरक्लिप मणि (v 3.4.0) का उपयोग करता है। संक्षेप में। मेरे पास एक कहानी मॉडल और एक पोस्ट मॉडल है। एक कहानी में कई पद हो सकते हैं।सीएसआरएफ टोकन सत्यापन समस्याओं को ट्रिगर करने वाले पेपरक्लिप मणि

#story.rb 

class Story < ActiveRecord::Base 

    attr_accessible :title, :user_id, :username, :posts_attributes 

    belongs_to :user 
    has_many  :posts, :dependent => :destroy, 
         :order => "created_at DESC" 

    accepts_nested_attributes_for :posts, :reject_if => lambda { |t| t['contents'].nil? } 

end 

#post.rb 

class Post < ActiveRecord::Base 

    attr_accessible :contents, :photo, :dimensions 

    belongs_to :story, :touch => true 
    belongs_to :user, :touch => true 

    has_attached_file :photo, 
        :styles => { 
         :medium => { :geometry => "400x400>" }, 
         :thumb => { :geometry => "100x100>" }, 
        }, 
        :processors => [:thumbnail], 
        :storage => :s3, 
        :s3_credentials => "#{Rails.root.to_s}/config/s3.yml", 
        :path => "/:style/:id/:filename" 


    before_save :extract_dimensions 

    serialize :dimensions 

    validates :contents, :presence => true, 
         :length   => { :maximum => 399, 
             :minimum => 5 } 
    validates :user_id, :presence => true 

    validates_attachment_content_type :photo, 
    :content_type => ['image/jpeg', 'image/png', 'image/gif', 'image/jpg'], 
    :message => "Sorry, we don't support that type of image format" 

end 

आप देख सकते हैं, पदों एक तस्वीर लगाव हो सकता है। मैं इन अनुलग्नकों को प्रबंधित करने के लिए पेपरक्लिप का उपयोग करता हूं।

मैं ऐसे फॉर्म जेनरेट करता हूं जो क्लाइंट पर जावास्क्रिप्ट/jquery के साथ गतिशील रूप से पोस्ट करता है। मेरी समस्या यह है। । । अगर पोस्ट में फोटो अटैचमेंट शामिल नहीं है, तो सब कुछ पूरी तरह से काम करता है। अगर, हालांकि, एक पोस्ट चुकी फ़ोटो लगाव, मैं निम्न त्रुटि संदेश प्राप्त होता है और बाद पोस्ट नहीं करता है:

WARNING: Can't verify CSRF token authenticity 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 61 LIMIT 1 
    (0.3ms) BEGIN 
    (0.2ms) COMMIT 
Completed 401 Unauthorized in 238ms 

नतीजतन, मेरी सत्र डेटा नष्ट हो जाता है, और मैं भी नहीं देख सकते फायरबग के साथ अनुरोध हेडर। पुट अनुरोध बस फायरबग में प्रकट नहीं होता है।

अब, आश्चर्यजनक रूप से नहीं, मैं इस समस्या को हल PostController में निम्नलिखित के साथ प्राप्त कर सकते हैं:

skip_before_filter :verify_authenticity_token, :only => [:create] 

लेकिन मैं इस सुरक्षा देने के लिए नहीं करना चाहती। मैं भी के माध्यम से मेरी फार्म के लिए CSRF हेडर को जोड़े की कोशिश की है js/jQuery:

jQuery.ajaxSetup({ 
    beforeSend: function(xhr) { 
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-   
      token"]').attr('content')); 
    } 
}); 

लेकिन उस समस्या का समाधान नहीं होता है, और जैसा कि मैंने ऊपर कहा, मैं भी देखने के लिए अनुरोध हेडर डेटा नहीं देख सकते हेडर

कोई भी इस कारण से आ सकता है कि क्यों पेपरक्लिप समस्या को ट्रिगर करता है?

+4

एक ही समस्या यहाँ – Pasta

उत्तर

1

मुझे पता है कि यह कुछ समय के बाद से मैं पहले से ऊपर प्रश्न पोस्ट हो गया है, लेकिन लोगों को अभी भी अपनी खोजों में यह पा रहे हैं संभालती उपयोग कर सकते हैं, इसलिए मैंने सोचा कि मैं अद्यतन करता हूँ एक उत्तर के साथ चीजें।

ऊपर चर्चा की गई समस्या पेपरक्लिप से कोई लेना देना नहीं था। फ़ॉर्म को सीएसआरएफ टोकन के बिना सबमिट किया जा रहा है क्योंकि मैं फाइल संलग्नक वाले फॉर्म जमा करने के लिए remotipart.js का उपयोग कर रहा हूं। Remotipart फ़ॉर्म डेटा को एक आई-फ्रेम में कॉपी करके एक फॉर्म को जमा करने में सक्षम बनाता है, जो तब आपकी साइट सक्रिय होने पर सामान्य (यानी, गैर-AJAX) सबमिशन बनाता है। आई-फ्रेम के माध्यम से AJAX फ़ाइल अपलोड के अधिक विस्तृत विवरण के लिए this article देखें।

रिमोटिपार्ट के पिछले संस्करणों में सीएसआरएफ टोकन को आई-फ्रेम द्वारा प्रस्तुत किए गए फॉर्म पर कॉपी नहीं किया गया था। रिमोटिपर्ट का समर्थन करने वाले अच्छे लोगों ने अब इस कमी को तय कर दिया है।आप ठीक here

0
$.ajaxSetup({ 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('X-CSRF-Token', 
          $('meta[name="csrf-token"]').attr('content')); 
    } 
}); 

js

में और

<%= csrf_meta_tags %> 

फ़ाइल लेआउट में यह काम कर रहा करने के लिए पर्याप्त होना चाहिए।

अन्यथा आप jquery-rails मणि कि CSRF टोकन

+0

ज्यादातर तुम सिर्फ जरूरत है <% = csrf_meta_tags%> अपने लेआउट में - अनुभाग में । – Eskim0

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