2009-12-02 4 views
0

Dites que j'ai une collection de @dogs, et je veux rendre une partie de la collection dans un endroit et le reste dans un autre. Il est facile de les cracher tous sortir ensemble:rendu: partiel avec un manipulé: collection

render :partial => 'dogs/summary', :collection => @dogs, :as => :dog 

Mais est-il possible de manipuler (affiner) votre collection en ligne, ou est-il une meilleure pratique de faire ces définitions dans votre contrôleur et faire quelque chose comme:

%h2 Male Dogs: 
render :partial => 'dogs/summary', :collection => @male_dogs, :as => :dog 

%h2 Female Dogs: 
render :partial => 'dogs/summary', :collection => @female_dogs, :as => :dog 

Merci.

Répondre

4

L'argument de collecte prend juste une liste. Il n'y a aucune raison que cela ne fonctionne pas:

render :partial => 'dogs/summary', :as => :dog, 
    :collection => @dogs.select{|dog| dog.gender == "M"} 

Personnellement, je préfère créer ces listes dans le contrôleur. Je pense que ça a l'air mieux, et peut être rendu beaucoup plus sec avec des portées nommées.

IE:

Modèle

class dog < ActiveRecord::Base 
    named_scope :male, :conditions => {:gender => "M"} 
    named_scope :female, :conditions => {:gender => "F"} 
    ... 
end 

Contrôleur

class DogsController < ApplicationController 
    ... 
    def index 
    if params[:user_id] 
     @user = User.find(params[:user_id]) 
     @male_dogs = @user.dogs.male 
     @female_dogs = @user.dogs.female 
    else 
     @male_dogs = Dog.male 
     @female_dogs = Dog.female 
    end 
    end 
end 

Voir

%h2 Male Dogs 
= render :partial => 'dogs/summary', :as => :dog, 
    :collection => @male_dogs 

%h2 Female Dogs 
= render :partial => 'dogs/summary', :as => :dog, 
    :collection => @female_dogs 
+0

C'est parfait. Merci beaucoup! – doctororange

+1

classe Chien; def male ?; genre == "M"; fin; alors vous pouvez faire @ dogs.select (&: male?) :) –

+0

@weppos: C'est un bon ajout pour les implémentations récentes de ruby. Cela fonctionne également pour le cas où named \ _scopes ne le fera pas. – EmFi

Questions connexes