2009-12-02 94 views
0

假設我有一個@dogs集合,我想在一個地方渲染集合的一部分,其餘部分渲染到另一個地方。這很容易吐出他們全部出齊:渲染:部分操作:集合

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

但有可能操縱(細化)您的收藏在線,或者是更好的做法,以使您的控制器的定義,並做一些事情,如:

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

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

謝謝。

回答

4

集合參數只是一個列表。沒有理由爲什麼這是行不通的:

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

個人而言,我更喜歡在控制器中創建的列表。我認爲看起來更好,並且可以通過命名作用域進行更多DRY。

IE:

模型

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

控制器

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 

查看

%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

這很完美。非常感謝! – doctororange 2009-12-02 15:41:03

+1

class Dog; def男性?性別==「M」;結束;那麼你可以做@ dogs.select(&:male?):) – 2009-12-02 15:43:43

+0

@weppos:這對於最近的ruby實現來說是一個很好的補充。它也適用於名稱\ _scopes不會執行的情況。 – EmFi 2009-12-02 16:10:01