रेलें: नियंत्रक वर्ग के नाम के आधार पर मॉडल वर्ग का नाम कैसे प्राप्त करें?


जवाबों:


190

यह यह करेगा:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

नियंत्रक क्रियाओं को अमूर्त करते समय इसकी अक्सर आवश्यकता होती है:

class HouseBuyersController < ApplicationController

  def index
    # Equivalent of @house_buyers = HouseBuyer.find(:all)
    objects = controller_name.classify.constantize.find(:all)
    instance_variable_set("@#{controller_name}", objects)
  end

end

@model_name = नियंत्रक_name.classify # रिटर्न "हाउसबॉयर्स" धन्यवाद!
पीटर एर्लिच

1
ActiveSupport :: Inflector कमाल है
Jared Beck

अपनी आवश्यकताओं के आधार पर, (यह प्रश्न कोई विवरण निर्दिष्ट नहीं करता है), आप controller_name.sub('_', ' ').titleize"हाउस बायर्स" प्राप्त करने के लिए कर सकते हैं ।
user664833

एक अलग उपयोगिता विधि में तर्क (मॉडल वर्ग प्राप्त करने के लिए) को स्थानांतरित करना अच्छा हो सकता है। इससे भी बेहतर है अगर परिणाम एक स्थिर में संग्रहीत किया जाता है, तो पहुंच को गति देने के लिए। आप new.controller_name.classify.constantizeवर्ग परिभाषा में उपयोग कर सकते हैं ।
केल्विन

मुझे लगता है कि यह ध्यान देने योग्य है कि यह एप्लिकेशन कंट्रोलर में भी काम करेगा जो इस बात पर निर्भर करता है कि कौन सा नियंत्रक इसे से विरासत में मिला है।
वेल्ट्सकमरज़

40

यदि आपका कंट्रोलर और मॉडल एक ही नाम स्थान पर हैं, तो आप क्या चाहते हैं

controller_path.classify

controller_pathआपको नामस्थान देता है; controller_nameऐसा नहीं करता।

उदाहरण के लिए, यदि आपका नियंत्रक है

Admin::RolesController

फिर:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT

6

यह थोड़ा हैक है, लेकिन यदि आपके मॉडल का नाम आपके नियंत्रक के नाम पर है तो:

class HouseBuyersController < ApplicationController
  def my_method
    @model_name = self.class.name.sub("Controller", "").singularize
  end
end

... आप अपने @model_name उदाहरण चर में "हाउसबियर" देंगे।

फिर, यह एक बहुत बड़ी धारणा बनाता है कि "हाउसबॉयर्सकंट्रोलर" केवल "हाउसबियर" मॉडल के साथ काम करता है।


4

कार्यस्थानों के नाम के लिए:

def resource_class
 controller_path.classify.constantize
end

0

यदि आप डिफ़ॉल्ट MVC का उपयोग कर रहे हैं, तो यह संभव नहीं है, जिसे आपका कोड अनुसरण नहीं करता है। आपका नियंत्रक एक मॉडल प्रतीत होता है, लेकिन हो सकता है कि आपको वहां एक प्रकार मिले। वैसे भी, नियंत्रकों और मॉडलों को मूल रूप से रेल एमवीसी में अलग किया जाता है ताकि नियंत्रक यह नहीं जान सकें कि वे किस मॉडल से जुड़े हैं।

उदाहरण के लिए आपके पास एक मॉडल हो सकता है जिसका नाम पोस्ट है। इसमें एक कंट्रोलर पोस्ट_कंट्रोलर हो सकता है या आर्टिकल_कंट्रोलर जैसा कंट्रोलर हो सकता है। जब आप नियंत्रक जैसे वास्तविक कोड को परिभाषित करते हैं, तो केवल मॉडल के बारे में पता होता है

def index
  @posts = Post.all
  @posts = Article.all
end  

रेल मानक नियंत्रकों में यह जानने का कोई तरीका नहीं है कि मॉडल क्या है।


0

स्वीकृत समाधान ने मेरे लिए काम नहीं किया क्योंकि मेरे नियंत्रक और मॉडल को नामांकित किया गया था। इसके बजाय, मैं निम्नलिखित विधि के साथ आया:

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.