11

मुझे रेल और एएसपी.नेट एमवीसी में निम्नलिखित समस्या के साथ कोई समस्या है। अक्सर पृष्ठ पर कार्यक्षमता के कई विजेट होते हैं, फिर भी एक नियंत्रक कार्रवाई पृष्ठ प्रस्तुत करना होता है। मुझे उदाहरण दें:एमवीसी वेब ढांचे में असंबद्ध विचारों के लिए सुरुचिपूर्ण समाधान क्या है?

मान लें कि मेरे पास एक सामान्य ई-कॉमर्स साइट है, और मेनू श्रेणियों से बना है, जबकि पृष्ठ उत्पादों के समूह को प्रदर्शित करना है।

def product_list 
    @products = Products.find_by_category(:name => 'lawnmowers') 
end 

और मैं की तरह

<div id="menu"><%= render :partial => 'menu' %></div> 
<div id="content"><%= yield %></div> 

उत्पादों दृश्य दिखाई देते हैं कुछ के साथ एक लेआउट है:

उत्पादों के लिए, मान मैं एक नियंत्रक पर एक कार्रवाई है कि तरह दिखता है डालते हैं। ..

<%= render :partial => 'product', :collection => @products %> 

(ध्यान दें मैं irre के रूप में उत्पाद को देखने ommited गए levant)

और मेनू

<% Category.each {|c| %> 
    <%= render :partial => 'menu_node', :locals => { :category => c } %> 
<% } %> 

लाइन मैं के साथ "Category.each.do" दृश्य में है एक समस्या है एक आंशिक है ...। मैं दृश्य में डेटा ला रहा हूं, क्योंकि नियंत्रक में सेट और बाध्य चर का उपयोग करने के विपरीत। और यह आसानी से एक और जटिल विधि कॉल हो सकता है जो मेनू उत्पन्न करता है।

समाधान मैं माना जाता है कर रहे हैं:

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

इनमें से कोई नहीं में मेरे लिए बहुत ही सुंदर लग रहे हैं। मैं मदद नहीं कर सकता लेकिन इस समस्या को देखता हूं और सोचता हूं कि एक एमवीपी प्रस्तुतकर्ता प्रति दृश्य (स्क्रीन नहीं) एक और अधिक सुरुचिपूर्ण समाधान है।

एएसपी.NET एमवीसी ने कार्रवाई प्रस्तुत की है (रेल रेंडर से अलग: कार्रवाई), जो इसे संबोधित करता है, लेकिन मुझे यकीन नहीं है कि मैं उस समाधान के बारे में क्या सोचता हूं।

विचार? समाधान सुझाव?

जोड़ा गया नोट: अब तक दिए गए उत्तरों अच्छे सुझाव हैं। और वे मेरे द्वारा दिए गए उदाहरण पर लागू होते हैं, जहां प्रत्येक लेआउट में मेनू मौजूद होता है, और उत्पाद डेटा के लिए स्पष्ट रूप से माध्यमिक होता है।

हालांकि, अगर कोई दूसरा वर्ग नागरिक स्पष्ट रूप से नहीं है तो क्या होगा? पोर्टल प्रकार साइटों में आमतौर पर कई असंबद्ध विजेट होते हैं, जिनमें प्रत्येक महत्वपूर्ण है।

उदाहरण के लिए, यदि यह पृष्ठ मौसम के रुझान प्रदर्शित कर रहा था, तापमान, आर्द्रता और वर्षा के लिए विजेट (और प्रत्येक एक अलग मॉडल और दृश्य प्रकार है)।

+0

उत्कृष्ट प्रश्न। मैं इसके साथ भी संघर्ष कर रहा हूं, क्योंकि मेरे ऐप में कई 'विजेट' की संभावना है। मुझे लगता है कि प्रत्येक विजेट में इसका स्वयं का नियंत्रक होना चाहिए जो जानता है कि इसे कैसे डेटा भेजना है, लेकिन यह सुनिश्चित नहीं है कि इसे एएसपी.नेट एमवीसी में कैसे कार्यान्वित किया जाएगा। –

+0

मैं इन परिदृश्यों में रेंडरएक्शन का उपयोग करता हूं, लेकिन जैसा कि आपने कहा है, यह बिल्कुल सही नहीं है। – DanP

+0

डैनपी, क्या आप रेल या एएसपीएनटी एमवीसी का जिक्र कर रहे हैं? –

उत्तर

3

रेल में हमें पतली नियंत्रकों, मोटी-मॉडल की अवधारणा पसंद है। तो मुझे लगता है कि आप नियंत्रक में चर सेट करना नहीं चाहते हैं।

साथ ही, उस पर बाद में एक और अधिक-जटिल विधि सक्षम करने के लिए, मैं कुछ की तरह करने की सलाह देते:

/app/controllers/application_controller.rb

before_filter :add_menu_nodes 

def add_menu_nodes 
    @menu_nodes = Category.menu_nodes(current_user) 
end 

/ऐप्स/विचारों/लेआउट/application.html.erb

<%= render :partial=>:menu, :locals=>{:categories=>@menu_nodes} %> 

/app/models/category.rb

def self.menu_nodes(current_user) 
    Category.all.order(:name) 
end 

भविष्य में आप वर्तमान उपयोगकर्ता के आधार पर, अधिक जटिल समाधान के साथ category.menu_nodes को अपडेट कर सकते हैं, यदि आपको आवश्यकता हो।

+0

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

1

अगर मैं रूबी कसाई (या अपने प्रश्न गलत) मुझे माफ कर दो, लेकिन क्या

class section_helper 
    def menu(section) 
     // ... 
     menuBuiltAbove 
    end 
end 
दृश्य

<%= section_helper.menu('section') %> 

में

साथ गलत क्या है?

+0

जो कोई बुरा सुझाव नहीं है, लेकिन यह मानता है कि मेनू एक दूसरा है उत्पादों के लिए वर्ग नागरिक। मेनू के मामले में, मैं सहमत हूं। लेकिन ऐसे परिदृश्य हैं जहां यह मामला नहीं है। यह केंद्रीय है कि मैंने एमवीसी को सरल साइटों के लिए महान क्यों देखा है, जहां प्रत्येक पृष्ठ का एक स्पष्ट उद्देश्य होता है, लेकिन पोर्टल प्रकार साइटों के लिए, मुझे लगता है कि पैटर्न संघर्ष करता है। –

+0

@ टिम हुलिहान मुझे लगता है कि मैं देखता हूं कि आपकी समस्या क्या है। पोर्टलों के लिए मैंने नियंत्रकों को AJAX कॉल करने के लिए अभी jquery का उपयोग किया है और फिर विजेट क्लाइंट पक्ष को अपडेट किया है। शायद वह विचार मदद करता है? –

+0

यह एक व्यावहारिक समाधान है जो मुझे लगता है कि ठीक है, लेकिन मुझे लगता है कि मैं एक पैटर्न समाधान की तलाश में हूं। और प्रदर्शन महत्वपूर्ण साइटों पर हम http अनुरोध जोड़ रहे हैं। –

संबंधित मुद्दे