पटरियों के अनुप्रयोग में कुकी अतिप्रवाह?


106

ActionDispatch :: कुकीज़ :: UsersController # में CookieOverflow # बनाएँ

पृष्ठ को खोलने का प्रयास करने पर मुझे यह त्रुटि हुई। मुझे नहीं पता कि इस त्रुटि को कैसे डीबग करें। क्या आपके पास इस समस्या के लिए कोई सुझाव है?

def create
  @user = User.new(params[:user])
  sign_in @user

  if @user.save
    @user.folders.create(:folder_name=>"Default Folder", :user_id=>@user.id)
    flash[:success] = "Welcome to Bunch<it>! "
    redirect_to @user
  else
    @title = "Sign up"
    render 'new'
  end
end


def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  session[:current_user] = user
  current_user = user
end

1
यह त्रुटि तब आती है जब आपके पास सत्र में एक बड़ा डेटा / ऑब्जेक्ट होता है। क्या आप नियंत्रक में कार्रवाई बनाने के लिए कोड साझा कर सकते हैं?
नरेन सिसोदिया

1
का डुप्लीकेट stackoverflow.com/questions/4782611/... ?
२ue

3
जबकि आपके सत्र स्टोर को बदलने के बारे में उत्तर सही हैं, तो मैं सवाल करूंगा कि आप सत्र में पूरे उपयोगकर्ता को क्यों संग्रहीत करना चाहते हैं। यदि आपको कुछ स्टोर करना है, तो user_id को स्टोर करें (हालांकि यह आपके कुकी में पहले से ही है)
फ्रेडरिक च्युंग

बस ब्राउज़र कैश स्टोर पर जाएं, और उस विशिष्ट वेबसाइट url से संबंधित कुकी साफ़ करें। मेरे लिए यह ज्यादातर लोकलहोस्ट में होता है।
बेन

मैंने एक उपयोगकर्ता मॉडल बनाया था Deviseऔर मैंने माइग्रेशन चलाने के बाद अपने विकास सर्वर को पुनः आरंभ नहीं किया था। एक बार जब मैंने किया, तो त्रुटि बंद हो गई।
wuliwong

जवाबों:


159

आपको कुकी में जो भी संग्रहित किया जा सकता है, उस पर आपको 4kb की सीमा मिल गई है, और जब रेल कुकी में लिखने के लिए आपकी वस्तु को पाठ में परिवर्तित करती है, तो शायद वह उस सीमा से बड़ी हो।

रूबी ऑन रेल्स ActionDispatch::Cookies::CookieOverflowएरर

इस तरह यह CookieOverflowत्रुटि होती है।

इसे हल करने का सबसे आसान तरीका है, आपको अपना session_store बदलने की आवश्यकता है और इसका उपयोग न करें cookie_store। आप active_record_storeउदाहरण के द्वारा उपयोग कर सकते हैं ।

यहाँ कदम है

  1. एक माइग्रेशन बनाएं जो सत्र तालिका बनाता है

    rake db:sessions:create
  2. माइग्रेशन चलाएं

    rake db:migrate
  3. संशोधित config/initializers/session_store.rbसे

    (App)::Application.config.session_store :cookie_store, :key => 'xxx'

    सेवा

    (App)::Application.config.session_store :active_record_store

एक बार जब आप तीन चरण कर लेते हैं, तो अपने आवेदन को पुनः आरंभ करें। रेल सत्र सत्र डेटा को संग्रहीत करने के लिए अब सत्र तालिका का उपयोग करेगा, और आपके पास 4kb सीमा नहीं होगी।


1
क्या यह देखना संभव है कि कुकी इसे बाहर की जाँच करने के लिए
मिटा दें

बस जिज्ञासु - क्या यह प्रति सत्र 4kb की सीमा है, या प्रति ऐप?
कोलिन

1
@ कोल्लिन, यह प्रति सत्र है।
एलेक्स डी

क्या मुझे active_record_storeमणि की आवश्यकता है ?
साद मसूद

या यह रेल 4 का हिस्सा है
साद मसूद

78

:active_record_store4/5 रेल में कार्य करने के लिए , आपको अपने एक्टिवरकॉर्ड-सेशन_स्टोर मणि को अपने साथ जोड़ना होगा Gemfile:

gem 'activerecord-session_store'

फिर माइग्रेशन जनरेटर चलाएं:

rails generate active_record:session_migration
rake db:migrate

और अंत में अपना सत्र स्टोर सेट करें config/initializers/session_store.rb:

Rails.application.config.session_store :active_record_store, :key => '_my_app_session'

अपडेट करें:

यदि कोई null value in column "session_id" violates not-null constraintरेल 4 में संदेश प्राप्त कर रहा है , तो जीथब (परीक्षण नहीं किया गया) में एक समाधान है । आपको एक इनिशलाइज़र बनाना होगाActiveRecord::SessionStore::Session.attr_accessible :data, :session_id


क्या इस मणि का उपयोग करते समय आपको कोई त्रुटि नहीं मिली? मुझे निम्न मिलता है:ERROR: null value in column "session_id" violates not-null constraint
पीटर

@Peter यह मुझे नहीं हुआ, लेकिन यहाँ अभी भी एक खुले मुद्दे के रूप में दिखाई देता है। मेरी एकमात्र सलाह उस मुद्दे में एक टिप्पणी लिखना है जब तक कोई इसे ठीक नहीं करता है। क्षमा करें: /
अल्टर लागोस

@Peter मुझे यकीन नहीं है कि अगर बहुत देर हो गई है, लेकिन वैसे भी मेरे अपडेट किए गए उत्तर की जांच करें
Alter Lagos

2
"रेल उत्पन्न करने के बाद सक्रिय_त्रय उत्पन्न करें: session_migration" चलाना न भूलें: "रेक डीबी: माइग्रेट करें"!
पैट्रिस गागन

2
क्या होगा अगर मैं डीबी में कुछ भी स्टोर नहीं करना चाहता हूं तो मैं त्रुटि को कैसे बचा सकता हूं? मैंने कोशिश की rescue_from ActionDispatch :: कुकीज़ :: CookieOverflow,: के साथ =>: ApplicationController में render_404 लेकिन यह काम नहीं किया था
nisevi

14

यदि आप इसे देख रहे हैं, तो जांचें कि आप कुछ सत्र डेटा नहीं उड़ा रहे हैं। मेरे मामले में, यह फ्लैश संदेश में एक ही संदेश के हजारों था। बस केह रहा हू।

मुझे लगता है कि अगर आपको लगता है कि समाधान आपके कुकी स्टोर को बड़ा बनाने के लिए है (जैसा कि अन्य उत्तरों के अधिकांश पते पर है), तो आप शायद कुकीज़ में वास्तव में डाल रहे हैं, जो आप वास्तव में डाल रहे हैं। यदि आपको दो से अधिक टोकन की आवश्यकता है, सत्र आईडी और शायद कुछ लेआउट / ट्रैकिंग कुकीज़, आप 90 के दशक में रह रहे हैं।


1
मैं राज्य को बचाने के लिए कुछ परमों का विलय कर रहा था!
अनवर

2
यह मेरे लिए भी त्रुटि का कारण था। फ्लैश मैसेज में बहुत अधिक डेटा डालना।
नॉबी

10

सत्र में किसी मॉडल ऑब्जेक्ट को संग्रहीत करना एक अच्छा विचार नहीं है।

इस विषय पर इस रेलसेक को देखें: http://railscasts.com/episodes/13-dangers-of-model-in-session?autoplay=true

सत्र के अंदर आईडी (इस मामले में उपयोगकर्ता की आईडी) को संग्रहीत करना बेहतर अभ्यास है। तब आपको यह समस्या नहीं होगी।

(ऊपर फ्रेडरिक चेउंग टिप्पणी भी देखें)।


9

त्रुटि संदेश स्पष्ट रूप से कुकी स्टोर आकार के साथ समस्या को इंगित करता है जो अतिप्रवाह है।

इस समस्या को हल करने के लिए आपके सत्र (कुकी में डिफ़ॉल्ट रूप से) को सक्रिय रिकॉर्ड स्टोर या मेमाचे स्टोर में ले जाना होगा।

डाटबेड सत्रों के लिए:

config.action_controller.session_store = :active_record_store

आपको नीचे के रूप में सत्र तालिका बनाने की आवश्यकता है

rake db:sessions:create
rake db:migrate

या

Memcache सत्रों के लिए:

config.action_controller.session_store = :mem_cache_store

इसके अलावा, आपको एक मेम कैश सर्वर सेटअप करने और इसे नीचे के रूप में कॉन्फ़िगर करने की आवश्यकता है:

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}

6

वह त्रुटि इसलिए है क्योंकि आप उपयोगकर्ता मॉडल को क्रमबद्ध करने का प्रयास कर रहे हैं जब किसी ऑब्जेक्ट को कुकी में संग्रहीत किया जाता है, तो रेल मार्शल का उपयोग करेगा। यह बड़ी मात्रा में सामग्री का उत्पादन कर सकता है क्योंकि यह उपयोगकर्ता रिकॉर्ड पर सब कुछ है।

इसके बजाय वास्तविक उपयोगकर्ता रिकॉर्ड को session[:current_user] = userस्टोर करने की कोशिश के साथ ही उपयोगकर्ताओं की आईडी को स्टोर करने की कोशिश करें, फिर उपयोगकर्ता को उस तरह से देखने के लिए एक विधि है जैसे

def sign_in(user)
  ...
  session[:current_user_id] = user.id
end

def current_user
  @current_user ||= User.find(session[:current_user_id])
end

1

यह त्रुटि मेरे लिए तब दिखाई दी जब मैं एक चश्मा चला रहा था। 1.x से 2.x तक Capybara को अपडेट करने के बाद। बस रेक tmp: स्पष्ट इसे हल किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.