2010-03-17 7 views
5

Oldukça basit bir modelim var; Kullanıcılar have_many ürünleri. Tüm ürünlerin listesini ve belirli bir kullanıcıyla ilişkili ürünlerin listesini görmek istiyorum. Benim yolları böyle kurulur: BuradaEn İyi Raylar'da iç içe geçmiş kaynaklara yönelik görüşler için uygulama?

/products 
/products/:id 
/users 
/users/:id 
/users/:id/products 

yakalamak Ben ürün # endeksi görünümü ve kullanıcı/ürünler # endeksi görünümünde farklı ürün listesini görüntülemek istiyorum olmasıdır.

Bunu yapmak için 'doğru' bir yol var mı? Şu anki çözümüm, kullanıcıları iç içe geçmiş bir kaynak olarak tanımlamak ve sonra paramları kontrol etmek [: user_id] - eğer bulduysa 'index_from_user' adlı bir şablon oluşturuyorsam, sadece tipik 'index' şablonunu oluşturuyorum.

Bu benim çok içine çalıştırıyorum bir durum - İki "ürünler" güzergahları ilan edebilir

+0

genellikle sorunu çözer bir cevap "kabul" etmek uygun olarak kabul edilir. Bunu cevabın yanındaki "işaretle" tıklayarak yapabilirsiniz :) –

cevap

2

bilmek sevinirim bunu yapmak için tercih edilen bir yoldur ... varsa - kullanıcıların altında biri, ve kullanıcıların bağımsız bir örneğin:

map.resources: ürünler map.resources: kullanıcıların,: has_many =>: ürünlerini

Onlar hem "ProductsController # indeksi" arayacaktır

ama ikinci olacak " user_id "rotadan önceden dolduruldu (not:" user_id "sadece" id "değil)

Böylece, bunu indeks yönteminde test edebilir ve var olup olmadığına bağlı olarak farklı öğeleri görüntüleyebilirsiniz.

Sen mesela kullanmadan önce aslında kullanıcı modeli örneğini ProductController bir before_filter eklemek gerekir:

before_filter :get_user # put any exceptions here 

def index 
    @products = @user.present? ? @user.products : Product.all 
end 

# all the other actions here... 


# somewhere near the bottom... 
private 

def get_user 
    @user = User.find(params[:user_id]) 
end 

gerçekten bambaşka görünümler görüntülemek istiyorsanız, sadece açıkça bunu yapabilir endeks eylem eg:

def index 
    @products = @user.present? ? @user.products : Product.all 
    if @user.present? 
    return render(:action => :user_view) # or whatever... 
    end 
    # will render the default template... 
end 
İlgili konular