রেলের আবেদনে কুকি ওভারফ্লো?


106

অ্যাকশনডিস্পাচ :: কুকিজ :: কুকি ওভারফ্লো ব্যবহারকারীদের নিয়ন্ত্রণকারী # তৈরি করুন

পৃষ্ঠাটি খোলার চেষ্টা করার সময় আমার এই ত্রুটি রয়েছে। এই ত্রুটিটি কীভাবে ডিবাগ করা যায় তা আমি জানি না। এই সমস্যার জন্য আপনার কি কোনও পরামর্শ আছে?

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
এই ত্রুটিটি তখন আসে যখন আপনার অধিবেশনটিতে একটি বড় ডেটা / অবজেক্ট থাকে। আপনি কন্ট্রোলারে ক্রিয়া তৈরির জন্য কোডটি ভাগ করতে পারেন?
নরেন সিসোদিয়া


3
আপনার সেশন স্টোরটি পরিবর্তন করার উত্তরগুলি সঠিক হওয়া সত্ত্বেও আপনি কেন সেশনটিতে পুরো ব্যবহারকারীর সঞ্চয় করতে চান তা আমি জিজ্ঞাসা করব। আপনার যদি কিছু সঞ্চয় করতে হয় তবে ইউজার_আইডিটি সংরক্ষণ করুন (যদিও এটি ইতিমধ্যে আপনার কুকিতে রয়েছে)
ফ্রেডেরিক চেং

কেবল ব্রাউজার ক্যাশে স্টোরটিতে যান এবং সেই নির্দিষ্ট ওয়েবসাইট ইউআরএল সম্পর্কিত কুকিজ সাফ করুন। আমার জন্য এটি বেশিরভাগ লোকালহোস্টে হয়।
বেন

আমি এর সাথে একটি ব্যবহারকারী মডেল তৈরি Deviseকরেছি এবং মাইগ্রেশনগুলি চালানোর পরে আমি আমার বিকাশ সার্ভারটি পুনরায় আরম্ভ করি নি। আমি একবার করলে ত্রুটি বন্ধ হয়ে যায়।
উলিওং

উত্তর:


159

আপনি কুকিতে যা সঞ্চয় করতে পারবেন তার একটি 4kb সীমা পেয়েছেন, এবং যখন কুকি আপনার কুকিকে লেখার জন্য পাঠ্যতে রূপান্তরিত করে তখন সম্ভবত এই সীমাটি তার চেয়ে বড়।

রুবে অন রেলে ActionDispatch::Cookies::CookieOverflowত্রুটি

এই CookieOverflowত্রুটি ঘটে।

এটির সমাধানের সবচেয়ে সহজ উপায় হ'ল আপনার সেশন_স্টোর পরিবর্তন করতে হবে এবং এটি ব্যবহার করবেন না 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_storeকার্যকারিতা 4/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
পিটার

@ পিটার এটি আমার হয়নি, তবে এখানে এখনও একটি মুক্ত বিষয় হিসাবে উপস্থিত রয়েছে। আমার একমাত্র পরামর্শ হ'ল কেউ যদি কোনও সমস্যার সমাধান না করে ততক্ষণ এটিকে দেখার জন্য একটি সমস্যা লিখুন। দুঃখিত: /
অ্যালটার লাগোস

@ পিটার আমি নিশ্চিত না যে খুব দেরি হয়েছে কিনা, তবে যাইহোক আমার আপডেট হওয়া উত্তরটি পরীক্ষা করুন
আলটার লাগোস

2
"রেলগুলি চালিয়ে যাওয়ার পরে অ্যাক্টিভ_রের্ডার তৈরি হয়: সেশন_ইমিগ্রেশন" চালাতে ভুলবেন না: "রেক ডিবি: মাইগ্রেট"!
প্যাট্রিস গাগনন

2
আমি যদি ডিবিতে কিছু সঞ্চয় করতে না চাই তবে কীভাবে আমি ত্রুটিটি উদ্ধার করতে পারি? আমি অ্যাকশনডিস্পচ থেকে রেসকিউ চেষ্টা করেছি: কুকিজ :: কুকি ওভারফ্লো,: সাথে =>: অ্যাপ্লিকেশন নিয়ন্ত্রণকারীটিতে রেন্ডার_404 কিন্তু এটি কার্যকর হয়নি
নিসেইভি

14

যদি আপনি এটি দেখতে পান তবে পরীক্ষা করুন যে আপনি কিছু সেশন ডেটা ফুটিয়ে তুলছেন না। আমার ক্ষেত্রে, এটি একই বার্তা হাজার হাজার ফ্ল্যাশ বার্তা মধ্যে পাম্প ছিল। কথা মাত্র.

আমি যুক্ত করব যে আপনি যদি মনে করেন সমাধানটি আপনার কুকি স্টোরকে আরও বড় করা (অন্য উত্তরগুলির বেশিরভাগ হিসাবে), আপনি সম্ভবত কুকিজের মধ্যে কী রাখছেন তা পুনর্বিবেচনা করা ভাল you're আপনার যদি বেশ কয়েকটি লেখক টোকেন, সেশন আইডি এবং সম্ভবত কয়েকটি লেআউট / ট্র্যাকিং কুকিজের প্রয়োজন হয় তবে আপনি 90 এর দশকে বাস করছেন।


1
রাষ্ট্র বাঁচাতে আমি গভীরভাবে কিছু প্যারাম মিশে গেলাম!
আনোয়ার

2
এটি আমার জন্যও ত্রুটির কারণ ছিল। ফ্ল্যাশ বার্তায় খুব বেশি ডেটা রাখা।
নুবি

10

সেশনে কোনও মডেল অবজেক্ট সংরক্ষণ করা ভাল ধারণা নয়।

: এই বিষয়ে এই railscast পরীক্ষা করে দেখুন 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

অথবা

মেমকেচে সেশনের জন্য:

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. জাস্ট রেক ট্যাম্প: ক্লিয়ার এটি সমাধান করেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.