रूबी ऑन रेल्स में आपका स्वागत है / होम पेज - सबसे अच्छा अभ्यास


80

मेरा मुखपृष्ठ (या स्वागत पृष्ठ) दो मॉडलों के डेटा से युक्त होगा (उन्हें लेखक और पोस्ट को कॉल कर सकता है)। मैं रेल के लिए नया हूं और निश्चित नहीं हूं कि इसे पूरा करने का सबसे अच्छा तरीका क्या है।

क्या मुझे स्वागतकर्ता नामक एक नया नियंत्रक बनाना चाहिए जो लेखकों और पदों से डेटा एकत्र करता है और फिर उन्हें स्वागत सूचकांक दृश्य में प्रदर्शित करता है? या मुझे पोस्ट मॉडल के तहत एक स्वागत योग्य विचार रखना चाहिए जिसमें लेखकों का डेटा भी मिलता है? या इसे पूरा करने का कोई और तरीका?

मैं समझता हूं कि यह सब तकनीकी रूप से कैसे किया जाता है लेकिन सिर्फ यह सुनिश्चित करें कि रेल ढांचे का उपयोग करने का सबसे अच्छा अभ्यास तरीका क्या है।

जवाबों:


52

सवाल यह है कि क्या आपका होम पेज सिर्फ एक लैंडिंग पेज है या यह पृष्ठों का एक समूह होगा? यदि यह सिर्फ एक लैंडिंग पृष्ठ है, तो आप अपने उपयोगकर्ताओं को कहीं और जाने के अलावा लंबे समय तक वहां घूमने की उम्मीद नहीं करते हैं। यदि यह पृष्ठों का एक समूह है, या किसी मौजूदा समूह के समान है, तो आप उस नियंत्रक से एक क्रिया जोड़ सकते हैं जो इसे सबसे अधिक पसंद है।

मैंने अपने वर्तमान प्रोजेक्ट के लिए जो काम किया है Static, उसका नाम नियंत्रक है , क्योंकि मुझे 3 स्टैटिक पेज चाहिए। होम पेज इनमें से एक है, क्योंकि कहीं और जाने के अलावा देखने या करने के लिए कुछ भी नहीं है।

डिफ़ॉल्ट मार्ग को मैप करने के लिए, निम्नलिखित का उपयोग करें routes.rb:

# Place at the end of the routing!
map.root :controller => 'MyController', :action => :index

मेरे मामले में यह होगा:

map.root :controller => 'static', :action => :index

यदि आप चाहें, तो आप इस होम पेज के लिए एक कंट्रोलर बना सकते हैं। मैं इसे मुख्य, या ऐसी कोई चीज़ कहूँगा जिसे आप याद रख सकते हैं जो होम पेज से संबंधित है। वहां से आप अपना डेटा और अपने मॉडल प्राप्त कर सकते हैं और आउटपुट दृश्य को स्थगित कर सकते हैं।

class MainController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end

यह मानते हुए कि आपके मॉडल रिश्ते सही ढंग से परिभाषित हैं, इससे मिलान करने का खाका बहुत सरल होगा।

सौभाग्य की कामना, आशा है इससे सहायता मिलेगी।


इसलिए इस नए कंट्रोलर / एक्शन में ऐसा ही कुछ लिखना @posts = Posts.find( ...या लिखना @posts = Posts.allDRY के सिद्धांतों का उल्लंघन नहीं माना जाएगा, हालांकि इस तरह का कोड Postकंट्रोलर की indexकार्रवाई में पहले से ही दिखाई दे सकता है? क्या कोई बेहतर (अधिक मॉड्यूलर) तरीका है, जो पहले से ही लिखित कोड के Postनियंत्रक की indexकार्रवाई का उपयोग करता है?
लेज़रशेक्स

127

वहाँ एक भी सबसे अच्छा अभ्यास नहीं लगता है।

(1) मानक config/routes.rbफ़ाइल यह सुझाव देती है कि रूट पेज (या होम / वेलकम पेज) को संभालना चाहिए welcome#index। यदि आपको इसके द्वारा निर्देशित किया जाना था, तो संबंधित welcome#indexनियंत्रक / कार्रवाई उत्पन्न करने के लिए , आप निम्न कमांड का उपयोग कर सकते हैं:

rails generate controller Welcome index

फिर, config/routes.rbआप get "welcome/index"जनरेटर द्वारा स्वचालित रूप से जोड़े गए जीईटी मार्ग ( ) को हटा सकते हैं , और रूट रूट root 'welcome#index'(या root :to => 'welcome#index'रेल्स < 4) को फ़ाइल के शीर्ष पर रख सकते हैं , क्योंकि यह संभवतः आपका सबसे लोकप्रिय मार्ग होगा और पहले मिलान किया जाना चाहिए।

public/index.htmlरेल्स में डिलीट करना भी याद रखें < 4

(2) रेल मार्ग गाइड पर आधिकारिक रूबी का उपयोग करता है PagesController। यह वास्तव में सुझाव देता है pages#main, हालांकि मेरे पास जाने के लिए अधिक समझ में आता है pages#home(क्योंकि "होमपेज" सर्वव्यापी शब्द / अवधारणा है)। साथ ही, इस नियंत्रक अन्य संभाल कर सकते हैं पेज उन्मुख जैसे कार्यों pages#about, pages#contact, pages#terms, pages#privacy, आदि

(3) रूबी ऑन रेल्स ट्यूटोरियल पर , साथ चला जाता है static_pages#homeऔर static_pages#help, आदि, हालांकि मैं "स्थिर" के साथ इस नियंत्रक को संकेतित के विचार पसंद नहीं है। इन पृष्ठों में अभी भी उनके लिए कुछ गतिशील पहलू होंगे, विशेषकर मुखपृष्ठ!

(४) यद्यपि यह चर्चा नहीं करता है कि मुखपृष्ठ को कैसे संभालना है , सेमी-स्टेटिक पेजों पर RailsCast # ११ Sem सुझाव देता है कि शो -ऑन संसाधनों के लिए दृष्टिकोण का एक और सेट है ।

मैं 1 और / या 2 की ओर वरीयता महसूस करता हूं। "और" परिदृश्य के साथ, आप स्वागत # इंडेक्स और पेज # के बारे में, आदि का उपयोग कर सकते हैं, जबकि "या" परिदृश्य के साथ, आप पेज # होम, पेज # के बारे में उपयोग कर सकते हैं, के बारे में आदि चुनने के लिए मजबूर होने पर, मैं विकल्प 2 के साथ सिर्फ इसलिए जाऊंगा क्योंकि आप कम कोड के साथ समाप्त होते हैं। और btw, 2 और 3 बहुत समान हैं, इसके अलावा शब्द "स्थिर"।


12
अच्छा जवाब, मैं 2) पेज # घर चुनूँगा।
नीरज

3
IMHO, @ user664833 द्वारा यह उत्तर स्वीकृत उत्तर होना चाहिए। स्पष्ट रूप से शोध और तर्क पर विचार व्यक्त करना।
बैजामिन रिचर्ड्स

29

मैंने खुद से कुछ इस तरह से पूछा जब मैंने पहली बार रेल शुरू की। यहां आपको जानना आवश्यक है:

  • मॉडल आवश्यक रूप से सीधे नियंत्रकों और विचारों से संबंधित नहीं हैं।

यही है, एक विशेष नियंत्रक / दृश्य संयोजन उतने ही मॉडल के साथ काम कर सकता है जितना आपको उस विशेष पृष्ठ को उत्पन्न करने की आवश्यकता होती है।

नियंत्रक का उद्देश्य उन डेटा को संग्रहीत करने के लिए उपयोग किए जाने वाले डेटा को संग्रहीत करने के लिए आवश्यक डेटासेट तैयार करना है।

दृश्य का उद्देश्य उस डेटा को सबसे उपयुक्त तरीके से प्रदर्शित करना है।

दूसरे शब्दों में, नियंत्रक / दृश्य संयोजन कभी भी एक विशेष मॉडल के अंतर्गत 'नहीं' होते हैं। वे मॉडल का उपयोग करते हैं, लेकिन किसी भी पदानुक्रमित संबंध में उनके अधीन नहीं हैं। वास्तव में, वे जो भी मॉडल का उपयोग करते हैं, वे सहकर्मी होते हैं।

मुझे लगता है कि भ्रम AWDR और अन्य परिचयात्मक ग्रंथों में पाए गए पाड़ जनरेटर उदाहरण से आता है, जैसे:

रूबी स्क्रिप्ट / पाड़ मॉडल नियंत्रक उत्पन्न करते हैं

मुझे पता है कि मॉडल और नियंत्रक / विचारों के बीच इस निहित संबंध ने मुझे थोड़ा भ्रमित किया। लेकिन वास्तव में कोई सख्त रिश्ता नहीं है। अगर वहाँ थे, तो MVC दृष्टिकोण के साथ कुछ भी जटिल करना बहुत मुश्किल होगा। और स्पष्ट रूप से, यह मामला नहीं है।

उम्मीद है की यह मदद करेगा।

- जॉन


10
आपके प्रश्न का उत्तर क्या है?
मार्क वाइल्डन

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

11

सबसे अच्छा अभ्यास आपका पहला सुझाव होगा। एक 'स्वागत' नियंत्रक बनाएं और जो भी मॉडल चाहें उससे रिकॉर्ड को कॉल करें। उस कंट्रोलर के लिए रूट रूट पॉइंट लें। बहुत साफ और उचित।


9

कृपया ध्यान दें कि Rails3 में, इसे संभालने का सही तरीका मार्गों के अंत में निम्नलिखित पंक्ति जोड़ना है।

root :to => "welcome#index"

और public / index.html.erb को हटा दें।

कृपया यह भी ध्यान दें कि आपका स्वागत है # इंडेक्स वेलकमकंट्रोलर में इंडेक्स एक्शन से मेल खाता है और दुष्ट पिस्सू के उत्तर से कोड दिखेगा:

class WelcomeController < ApplicationController
  def index
    @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
  end
end

1
यह या तो "स्वागत" नियंत्रक या एक विलक्षण संसाधन के लिए नहीं होना चाहिए, शो कार्रवाई का उपयोग करें।
खतरनाक

9

यह उत्तर रेल 3.2.1 के रूप में है।

पहले पृष्ठों के लिए एक नियंत्रक स्थापित किया, उदाहरण के लिए नाम static:

$ rails generate controller static

फ़ाइल में app/controllers/static_controller.rb:

class StaticController < ApplicationController
    def index       
    end
end

नई दृश्य फ़ाइल बनाएँ app/views/index.html.erb

और अंत में अपना कॉन्फ़िगर करें config/routes.rb:

MyApp::Application.routes.draw do
   match 'home', :to => "static#index"
   root :to => "static#index"
end

यह दोनों बना देगा /homeऔर /आपके द्वारा बनाई गई व्यू फ़ाइल में जो कुछ भी डालते हैं, उस पर जाएं।


बहुत अच्छा समाधान! मुझे match 'home' => 'static#index'
नाइटपिकी हो

6

एक नया नियंत्रक बनाएं जिसका नाम उचित रूप से आप ले सकते हैं। सारांशकंट्रोलर? StartController? DailyFrontPageController? आपको अंदाजा होगा।

इतना ही नहीं, मैं गंभीरता से एक नया मॉडल बनाने पर विचार करूंगा, नहीं में प्रस्तुति के लिए अपने लेखक और पोस्ट मॉडल (या जो भी उनके वास्तविक नाम हैं) से जानकारी एकत्र करता है कि ActiveRecord- आधारित । विकल्प नियंत्रक में डेटा को इकट्ठा करना है, जो लगभग निश्चित रूप से गड़बड़ हो जाएगा - यह हर बार जब मैंने कोशिश की थी, और मैंने इसे बहुत कोशिश की। एक अलग मॉडल बहुत टिडियर को समाप्त करता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.