মডিউল ট্রি থেকে এক্সএক্সএক্সএক্সের একটি অনুলিপি সরানো হয়েছে তবে এখনও সক্রিয় রয়েছে


129

আমি নিশ্চিত যে ত্রুটির TenantIdLoaderমডিউলটির আসল সামগ্রীটির সাথে কোনও সম্পর্ক নেই sure পরিবর্তে, এর ActiveSupportনির্ভরতাগুলির সাথে কিছু করার আছে ।

আমি এই ত্রুটিটি পেয়েছি বলে মনে হচ্ছে না। আমি যা পড়েছি তা থেকে, কারণ এটি হয় ActiveRecord::Baseপুনরায় লোড হচ্ছে বা Company::TenantIdLoaderপুনরায় লোড হচ্ছে, এবং এটি কোনওরকম এটি যোগাযোগ করছে না। অনুগ্রহ করে সাহায্য করবেন! আমি সত্যিই ails.২ রেলগুলিতে আপগ্রেড হতে সক্ষম হতে চাই।

সম্পাদনা

আমি এখন শিখেছি কারণ এটি উল্লেখ করছি Tenantযা স্বয়ংক্রিয়ভাবে পুনরায় লোড হচ্ছে। আমার যদিও ক্লাসটি আসলে রেফারেন্স করতে সক্ষম হওয়া দরকার, সুতরাং কেউ কীভাবে এই কাছাকাছি যেতে জানেন?

কনফিগ / application.rb

config.autoload_paths += %W( #{config.root}/lib/company )

কনফিগ / initializers / company.rb

ActionMailer::Base.send(:include, Company::TenantIdLoader)

lib / অনুপস্থিত কোম্পানী / tenant_id_loader.rb

module Company
  module TenantIdLoader

    extend ActiveSupport::Concern

    included do
      cattr_accessor :tenant_dependency
      self.tenant_dependency = {}
  
      after_initialize do
        self.tenant_id = Tenant.active.id if self.class.tenant_dependent? and self.new_record? and Tenant.active.present? and !Tenant.active.zero?
      end
    end

    # class methods to be mixed in
    module ClassMethods
  
      # returns true if this model's table has a tenant_id
      def tenant_dependent?
        self.tenant_dependency[self.table_name] ||= self.column_names.include?('tenant_id')
      end
  
    end

  end
end

3
এই উত্তর কি আদৌ সহায়তা করে? stackoverflow.com/questions/17561697/...
Waynn লু

আপনি কি ভাড়াটিয়া শ্রেণি জড়িত তা নিশ্চিত? আপনি যদি সেই কোডটির বিটগুলি ভাড়াটে ব্যবহার করেন তবে আপনি কি এখনও একটি ত্রুটি পেয়েছেন?
ফ্রেডরিক চিউং

@ ওয়েইনলু হ্যাঁ, আমি মনে করি এটি কারণ, আমি কীভাবে এটি ঠিক করতে জানি না।
kddeisz

@ ফ্রেডেরিকচিউং এর সাথে অনুরূপ অন্য একটি ফাইল পেয়েছি যা একইভাবে ত্রুটিযুক্ত হয় এবং এটি সবসময় টেন্যান্টের সাথে সম্পর্কিত লাইনে ত্রুটিযুক্ত থাকে, তাই এটি আমার সেরা অনুমান।
kddeisz

1
যদিও আপনি এখানে রেলগুলিতে উইসপার ব্যবহার করছেন না, তবে অন্যান্য ব্যক্তিদের পক্ষে এটি লক্ষ্য করা কার্যকর হবে যে উইস্পার এই সমস্যাটি মোটামুটি ধারাবাহিকভাবে ঘটায় যদি আপনি এই থ্রেডের পরামর্শ অনুসরণ না করেন: স্ট্যাকওভারফ্লো
স্টিভ এন

উত্তর:


182

Tenantএকটি লাল হেরিং এর ধরণ - যদি আপনি রেলের const_missingট্রিক দ্বারা লোড করা দরকার এমন কোনও অ্যাপের রেফারেন্স করেন তবে ত্রুটি ঘটবে ।

সমস্যাটি হ'ল আপনি পুনরায় লোডযোগ্য কিছু (আপনার মডিউল) নিচ্ছেন এবং তারপরে এটি পুনরায় লোডযোগ্য নয় এমন কিছুতে অন্তর্ভুক্ত করছেন ( ActiveRecord::Baseবা, আপনার পূর্ববর্তী উদাহরণে ActionMailer::Base)। এক পর্যায়ে আপনার কোডটি পুনরায় লোড করা হয়েছে এবং এখন অ্যাক্টিভেকর্ডটিতে এই মডিউলটি এতে অন্তর্ভুক্ত রয়েছে যদিও রেলরা মনে করে এটি এটিকে লোড করেছে। ত্রুটি ঘটে যখন আপনি ভাড়াটিয়াকে রেফারেন্স করেন কারণ এর ফলে টেনেন্টটি const_missingকোথা থেকে লোড করা উচিত এবং এই কোডটি ফ্রিক আউট করার জন্য রেলগুলি তার হুকগুলি চালিত করে এবং কারণ যে মডিউলটি থেকে ধ্রুবক অনুসন্ধান শুরু হচ্ছে তা সেখানে থাকা উচিত নয়।

এখানে 3 টি সম্ভাব্য সমাধান রয়েছে:

  1. আপনার মডিউলটি নন-লোডযোগ্যযোগ্য ক্লাসগুলিতে অন্তর্ভুক্ত করুন - হয় পৃথক মডেলগুলিতে অন্তর্ভুক্ত করুন, প্রয়োজন অনুযায়ী নিয়ন্ত্রক বা একটি বিমূর্ত বেস শ্রেণি তৈরি করুন এবং সেখানে মডিউলটি অন্তর্ভুক্ত করুন।

  2. অটোল্যাড_পথগুলিতে নেই এমন কোনও জায়গায় সংরক্ষণ করে এই মডিউলটি নন-লোডযোগ্যযোগ্য করে তুলুন (আপনার স্পষ্টরূপে এটির প্রয়োজন হবে কারণ রেলগুলি আর আপনার জন্য যাদুতে এটি লোড করবে না)

  3. থেকে :: ভাড়াটিয়া ভাড়াটিয়া পরিবর্তন ( Object.const_missingতারপর, প্রার্থনা করা হবে না Tenant.const_missing)


30
আমি একটি তৃতীয় সমাধান খুঁজে পেয়েছি বলে মনে হচ্ছে, যদিও আমি ভাবছিলাম যে এটি কেন কাজ করে তা আপনি জানেন। যদি আমি এটি উল্লেখ করি: ভাড়াটে, সবকিছু যাদুতে কার্যকর হয়। সম্ভবত এটি তখন শীর্ষ স্তরের ধ্রুবক হিসাবে লোড হচ্ছে? হতে পারে?
kddeisz

3
তারপরে এটি অবজেক্ট কনসট_মিসিং যা আপনার মডিউল.কোস্ট_মিসিংয়ের অনুরোধ করা হবে না যাতে জিনিসগুলি কার্যকর হয়
ফ্রেডেরিক চিউং

6
::আমার জন্য কাজ করেও শীর্ষ-স্তরে ব্যাক আপ করা !
অ্যালেক্স মুর-নীমি

7
আমার এই সমস্যাটি সময়ে সময়ে ঘটেছিল এবং আমার ক্ষেত্রে এটি বসন্তের সাথে সম্পর্কিত ছিল, তাই ./bin/spring stopকরা এটি সমাধান করছিল।
সানটাকাস

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


6

এটি কারও সাহায্য করবে কিনা তা নিশ্চিত নই, তবে সম্পর্কহীন বলে মনে হচ্ছিল এমন একটি পরিবর্তনের পরে আমার হঠাৎ এটি শুরু হয়েছিল। আমি অ্যাপ্লিকেশন সার্ভারটি পুনরায় চালু করার পরে এটি চলে গেছে।


0

আমার জন্য সমস্যা সমাধানে পরিবর্তন ModuleNameকরা হচ্ছে 'ModuleName'.constantize


0

আমার জন্য কী কাজ করেছে:

আপডেট config.eager_load = falseকরার জন্যtrue

ভিতরে config/environments/development.rb

রুবি 2.6.5
পাগল 5.1.6


1
হ্যাঁ অবশ্যই এটি করবেন না। এটি আপনার উন্নয়নের কোডটি পুনরায় লোড করার ক্ষমতা হারাতে চলেছে।
kddeisz

-13

কখনও কখনও আপনি ঠিক

আপনার সার্ভার পুনরায় চালু করুন,


আমি বুঝতে পারছি না কেন এই উত্তরটি নিম্নচাপিত? পুনরাবৃত্তি মানে এটি গুরুত্বপূর্ণ! সাধারণ জিনিসগুলিতে প্রচুর বাজে কথা হয় কেন?
অ্যালবার্ট.কুইং

7
এটি হ্রাস করা হয়েছে কারণ (ক) আপনি যতবার আপনার সার্ভার পুনরায় চালু করবেন তা আসল প্রশ্নে সমস্যার সমাধান করবে না, এবং (খ) আপনার কেবল সমস্যার লক্ষণগুলিই চিকিত্সা করা উচিত নয়, তবে সমস্যাটি নিজেই।
tjbp

@tjbp plz "কখনও কখনও" শব্দটি সম্পর্কে সাবধান?
আলবার্ট.কুইং

সমস্যাটি হ'ল যদি প্রতিটি পরিবর্তনের পরে সার্ভারটি পুনরায় চালু করতে হয় তবে অ্যাপ্লিকেশনটিকে ডেভলপমেন্ট মোডে ডিবাগ করা অসম্ভব।
ম্যাক্স ইভাক

2
আমি এই উত্তরের জন্য ভোট দিয়েছি কারণ আপনি যদি মঙ্গোড ব্যবহার করেন এবং রেল কনসোল থেকে অবজেক্ট এক্স মুছে ফেলেন তবে আপনি এই ত্রুটিটি পাবেন: অবজেক্টযুক্ত A copy of X has been removed from the module tree but is still activeসমস্ত পৃষ্ঠাতে Y.embeds Xএবং সার্ভারটি পুনরায় আরম্ভ করার জন্য এই নির্দিষ্ট ক্ষেত্রে কার্যকরভাবে কাজ করবে । তবে আপনার উত্তরটি সম্পাদনা করা উচিত।
লুকাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.