برنامه نویسی

بررسی محیط در Ruby on Rails چگونه کار می کند؟

در این مقاله قصد داریم به بررسی موضوعات زیر بپردازیم:

Rails.env.*؟

احتمالا مجبور شدی باهاش ​​کنار بیای Rails.env.production? یا Rails.env.development? برای کنترل یک جریان اجرا بسته به محیط فعلی.

rails> Rails.env.production?
 => false
rails> Rails.env.development?
 => true
rails> Rails.env.test?
 => false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Ruby on Rails یک روش برای هر محیط ارائه می دهد.

اما اگر به شما بگویم که این روش ها وجود ندارند چه؟

ActiveSupport::StringInquirer

اول، بیایید نگاهی به چه چیزی بیندازیم Rails.env است.

Rails.env.class # => ActiveSupport::StringInquirer
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Rails.env نمونه ای از ActiveSupport::StringInquirer.

این کلاس از ارث می برد String.

بنابراین Rails.env رشته ای است که محیط فعلی را نشان می دهد.

بیایید نگاهی بیندازیم که در پشت صحنه چه اتفاقی می افتد Rails.env.production? نامیده میشود.

روش hook_missing

چه زمانی Rails.env.production? نامیده می شود، StringInquirer#method_missing روش قلاب به عنوان نامیده می شود Rails.env.production? در این کلاس اجرا نمی شود.

در واقع، این روش هوک زمانی فراخوانی می شود که StringInquirer مسیر جستجوی متد طی شده است و هیچ یک از کلاس ها نمی توانند آن را مدیریت کنند production? پیام

این روش قلاب به شرح زیر عمل می کند:

  1. بررسی می کند که آیا پیام کنترل نشده حاوی a است یا خیر ? پسوند.

  2. اگر چنین است، مقایسه می کند self با نام پیام بدون ? پسوند.

  3. در نهایت نتیجه این مقایسه برگردانده می شود.

پاسخ_تو_از دست رفته؟ روش قلاب

وقتی استراتژی را با استفاده از method_missing، پس دشوار است که بدانیم کلاسی که این متد hook را پیاده سازی می کند به کدام متد می تواند پاسخ دهد.

در واقع، production? تعریف نشده است – همانطور که رفتار آن به آن تفویض شده است method_missing.

پس اگر این دستور را اجرا کنیم چه اتفاقی می افتد؟

ActiveSupport::StringInquirer.new.respond_to? :production?
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا، ما می خواهیم این بیانیه بازگردد true.

آنجاست respond_to_missing? وارد بازی می شود

module ActiveSupport
  class StringInquirer < String
    def respond_to_missing?(method_name, include_private = false)
      (method_name[-1] == "?") || super
    end
  end
end
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا، ما تعریف می کنیم respond_to_missing? که به طور ضمنی نامیده می شود که ما احضار می کنیم respond_to? در یک نمونه از ActiveSupport::StringInquirer.

این متد یک Boolean را برمی گرداند true اگر آخرین شخصیت از method_name هست یک ? یا آن را فرا می خواند در غیر این صورت – که برمی گردد false به صورت پیش فرض.

بنابراین، Rails.env.respond_to :production? برمی گرداند true زیرا با شرایط موجود مطابقت دارد respond_to_missing?.

💚


محتوای اختصاصی ما در توییتر را از دست ندهید:

>>> RubyCademy در توییتر <<<

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا