Ruby on Rails फैट मॉडल, स्कीनी नियंत्रक


उदाहरण

"फैट मॉडल, स्कीनी कंट्रोलर" संदर्भित करता है कि एमवीसी के एम और सी हिस्से आदर्श रूप से एक साथ कैसे काम करते हैं। अर्थात्, किसी भी गैर-प्रतिक्रिया-संबंधी तर्क को मॉडल में जाना चाहिए, आदर्श रूप से एक अच्छा, परीक्षण योग्य विधि में। इस बीच, "पतला" नियंत्रक केवल दृश्य और मॉडल के बीच एक अच्छा इंटरफ़ेस है।

व्यवहार में, इसके लिए विभिन्न प्रकार के रिफैक्टरिंग की आवश्यकता हो सकती है, लेकिन यह सभी एक विचार से नीचे आता है: किसी भी तर्क को स्थानांतरित करने से जो मॉडल (नियंत्रक के बजाय) की प्रतिक्रिया के बारे में नहीं है, न केवल आपने पुन: उपयोग को बढ़ावा दिया है जहां संभव हो, लेकिन आपने अनुरोध के संदर्भ के बाहर अपने कोड का परीक्षण करना भी संभव बना दिया है।

आइए एक साधारण उदाहरण देखें। कहो कि आपके पास इस तरह का कोड है:

def index
  @published_posts = Post.where('published_at <= ?', Time.now)
  @unpublished_posts = Post.where('published_at IS NULL OR published_at > ?', Time.now)
end

आप इसे इसमें बदल सकते हैं:

def index
  @published_posts = Post.published
  @unpublished_posts = Post.unpublished
end

फिर, आप तर्क को अपने पोस्ट मॉडल में स्थानांतरित कर सकते हैं, जहां यह इस तरह दिख सकता है:

scope :published, ->(timestamp = Time.now) { where('published_at <= ?', timestamp) }
scope :unpublished, ->(timestamp = Time.now) { where('published_at IS NULL OR published_at > ?', timestamp) }