2009-07-22 5 views
1

J'ai une collection qui contient des instances de plusieurs classes différentes, et je veux rendre le partiel pour chaque instance. Je peux le faire en utilisant le code suivant:Rendu d'une collection de classes différentes dans Rails

<%= render @results %> 

Ma question est: Comment puis-je rendre les différentes Partials dans un répertoire de base différent? Le code ci-dessus va chercher app/views/stories/_story.html.erb, cependant, les partiels pour cette action sont tous conservés dans un répertoire différent - app/search/_story.html.erb. Y a-t-il un moyen de spécifier cela?

Répondre

2

Vous pouvez créer une méthode d'aide comme ceci:

def render_results(results) 
    result_templates = {"ClassA" => "search/story", "ClassB" => "something/else"} 
    results.each do |result| 
    if template = result_templates[result.class.name] 
     concat render(:partial => template, :object => result) 
    end 
    end 
end 

Et puis dans l'appel de vue <% render_results(@results) %>

1

J'ai une situation similaire où j'ai plusieurs classes, donc j'utiliser une partie pour chaque classe comme :

for result in @results 
    = render :partial => "result_#{result.class.to_s.downcase}", :locals => {:item => result} 
end 
+1

Voici ce que j'utilise pour les résultats de recherche multimodèles, avec une différence: si vous passez '@ results' dans via': collection' au lieu d'utiliser un localisateur et un bloc 'for' ou' each', chaque objet est assigné à la variable 'partialname' de son partiel. Cela évite d'avoir des variables abstraites comme "item" (pas d'infraction!) Dispersées sur les contextes de vue des différentes classes et préserve le sens sémantique, par ex. 'school.address' vs' item.address' dans une section 'school' partielle. C'est un peu plus compliqué si vous ne voulez pas utiliser l'emplacement partiel par défaut 'classnames/_classname'. – Eric

+0

Bien mis @Eric –

2

ou vous pouvez utiliser is_a (Object)

012?
Questions connexes