11

Rails ve ASP.Net MVC'de aşağıdaki sorunla ilgili bir sorun yaşadım. Çoğu zaman, bir sayfada birçok işlevsellik öğesi vardır, ancak bir denetleyici eyleminin sayfayı oluşturması beklenir. Göstereyim:MVC web çerçevelerinde ilgisiz görünümler için zarif çözüm nedir?

Diyelim ki normal bir e-ticaret sitem var ve menü kategorilerden oluşurken, sayfa bir ürün grubunu görüntüleyecektir.

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

Ve

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

ürünleri görünümüne sahip olma gibi bir şey ile bir düzen vardır: ürünler için

, bu reklam gibi görünür bir denetleyici bir eylemi olduğunu varsayalım. ..

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

(ı irre gibi ürün görünümü ommited ettik dikkat Levant)

Ve menü ...

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

Ben görünümünde "Category.each.do" dir ile ilgili bir sorun çizgi kısmi vardır. Denetleyicide ayarlanmış ve bağlı değişkenleri kullanmak yerine, görünümde veri alıyorum. Ve menü üreten daha karmaşık bir yöntem çağrısı olabilir. Ben kabul ettik

çözümler şunlardır: verilerin çeşitli parçalarını temin etmesini bilen

-A görmek model taban sınıfı. Ama sitenin her kavramsal "bölümü" için bunlardan biriyle sonuçlanabilir.
-a yerel her yöntem (KURU ihlal) -aynı şeyin üstünde dolduran değişken, ancak bir before_filter çağrısı Bunlardan

Yok bana çok şık görünüyor. Yardım edemiyorum ama bu soruna bakıyorum ve her ekran için bir MVP sunumcunun (ekran değil) daha zarif bir çözüm olduğunu düşünüyorum.

ASP.Net MVC, bu sorunu çözen eylemi (raylardan farklı işlem: eylem) oluşturuyor, ancak bu çözüm hakkında ne düşündüğümü bilmiyorum.

Düşünceler? Çözüm önerileri

Eklenme Not: Şimdiye kadar verilen yanıtlar iyi önerilerdir. Ve, verdiğim örnekte, her mizanpanda bir menünün var olduğu ve ürün verilerine ikincil olarak yer verdiği için geçerlidirler. Bununla birlikte, açıkça ikinci sınıf bir vatandaş bulunmuyorsa ne olur? Portal tipi sitelerde, genellikle her birinin önemli olduğu, birbiriyle ilgisiz çoklu nesneler bulunur. Örneğin, Bu sayfa hava durumu eğilimlerini gösteriyorsa, sıcaklık, nem ve yağış widget'ları ile (ve her biri farklı bir model ve görünüm tipi).Ruby kasap (veya sorunuzu yanlış anlamak) eğer

+0

mükemmel bir soru. Uygulamam birçok 'widget' potansiyeline sahip olduğu için ben de bununla mücadele ediyorum. Bence her bir widget, kendisine ait verileri nasıl göndereceğini bilen, ancak ASP.NET MVC'de nasıl uygulanacağını bilmeyen kendi Denetleyicisine sahip olmalıdır. –

+0

Bu senaryolarda RenderAction'ı kullanma eğilimindeyim, ancak belirttiğiniz gibi, mükemmel olmaktan uzak. – DanP

+0

DanP, raylar veya asp.net mvc'den mi bahsediyorsunuz? –

cevap

3

Raylarda, ince kontrol cihazları, kalın modeller konseptine sahip olmayı seviyoruz. Bu yüzden kontrol cihazında ayarlanmış değişkenler istememek hakkınız olduğunu düşünüyorum.

Ayrıca daha sonra bir daha karmaşık yöntemini etkinleştirmek amacıyla, şöyle bir şey yapmanızı öneririz:

/app/controllers/application_controller.rb

before_filter :add_menu_nodes 

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

/app/views/düzenleri/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 

Gelecekte, Category.menu_nodes öğesini, gerekirse, geçerli kullanıcıya göre daha karmaşık bir çözümle güncelleyebilirsiniz.

+0

teşekkürler, bu güzel bir yazı. Bu muhtemelen raylar tarafında henüz gördüğüm en temiz çözümdür. Her bir düzende bu verinin gerekli olduğunu varsayar. Ve bu durum söz konusu olmayan 2. sınıf veri modelini (kategorileri) ifade eder. ama bvc'de bu konuya sahip olmanın kaçınılmaz olduğunu düşünüyorum. –

1

Bağışlayın ama ne görünümünde

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

yılında

class section_helper 
    def menu(section) 
     // ... 
     menuBuiltAbove 
    end 
end 

nesi var?

+0

yapmak için kötü bir öneri değil, ancak menü 2 olduğunu varsayar ürünlere sınıf vatandaşı. Bir menü durumunda, kabul ediyorum. Fakat durumun böyle olmadığı senaryolar var. Bu mvc'i, her sayfanın net bir amacı olduğu, ancak sitelerin sitelerinin yerleştiği yer için harika olduğunu düşündüğümün merkezinde yer alır. –

+0

@Tim Hoolihan Sanırım sorunun ne olduğunu görüyorum. Portallar için denetleyicilere ajax aramaları yapmak için jquery'yi kullandım ve ardından widget istemci tarafını güncelledim. Belki bu fikir yardımcı olur? –

+0

, iyi olduğunu düşündüğüm pratik bir çözümdür, ama sanırım daha fazla desen çözümü arıyorum. ve performans kritik sitelerinde http istekleri ekliyoruz. –

İlgili konular