بررسی محیط در 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?
پیام
این روش قلاب به شرح زیر عمل می کند:
-
بررسی می کند که آیا پیام کنترل نشده حاوی a است یا خیر
?
پسوند. -
اگر چنین است، مقایسه می کند
self
با نام پیام بدون?
پسوند. -
در نهایت نتیجه این مقایسه برگردانده می شود.
پاسخ_تو_از دست رفته؟ روش قلاب
وقتی استراتژی را با استفاده از 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 در توییتر <<<