2010-03-17 10 views
5

मेरे पास एक काफी सरल मॉडल है; उपयोगकर्ताओं के पास कई उत्पाद हैं। मैं सभी उत्पादों की एक सूची के साथ-साथ किसी दिए गए उपयोगकर्ता से जुड़े उत्पादों की एक सूची देखने में सक्षम होना चाहता हूं। मेरे मार्गों इस तरह स्थापित कर रहे हैं:रेल में नेस्टेड संसाधनों के विचारों के लिए सर्वश्रेष्ठ अभ्यास?

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

यहाँ पकड़ है कि मैं उत्पाद # सूचकांक देख सकते हैं और उपयोगकर्ता /उत्पादों # सूचकांक ध्यान में रखते हुए अलग तरह से उत्पाद सूची प्रदर्शित करना चाहते हैं।

क्या ऐसा करने का कोई 'सही' तरीका है? मेरा वर्तमान समाधान उपयोगकर्ताओं के अंदर घोंसले संसाधन के रूप में उत्पादों को परिभाषित करना है, और फिर पैराम [: user_id] की जांच करने के लिए - यदि यह पाया जाता है कि मैं 'index_from_user' नामक टेम्पलेट प्रस्तुत करता हूं, अन्यथा मैं सामान्य 'इंडेक्स' टेम्पलेट प्रस्तुत करता हूं।

यह एक ऐसी स्थिति मैं एक बहुत में चल रहा हूँ है - वहाँ यह करने के लिए एक पसंदीदा तरीका मुझे पता है कि हमें खुशी होगी ...

+0

इसे आम तौर पर आपकी समस्या हल करने वाले उत्तर को "स्वीकार" करने के लिए अच्छा रूप माना जाता है। आप उत्तर के बगल में "टिक" पर क्लिक करके ऐसा कर सकते हैं :) –

उत्तर

2

आप दो "उत्पाद" मार्गों घोषणा कर सकते हैं - तो उन के तहत एक, और एक उपयोगकर्ता के स्वतंत्र जैसे:

map.resources: उत्पादों map.resources: उपयोगकर्ताओं,: has_many =>: उत्पादों

वे दोनों "ProductsController # सूचकांक" के लिए दिखेगा लेकिन दूसरे होगा " user_id "मार्ग से पूर्व-पॉप्युलेट (नोट:" user_id "न केवल" आईडी ")

तो आप इसके लिए इंडेक्स विधि में परीक्षण कर सकते हैं और विभिन्न वस्तुओं को प्रदर्शित कर सकते हैं कि यह मौजूद है या नहीं।

आप ProductController करने के लिए एक before_filter जोड़ने के लिए वास्तव में उपयोगकर्ता मॉडल का दृष्टांत इससे पहले कि आप उपयोग कर सकते हैं जैसे की आवश्यकता होगी:

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 

तुम सच में पूरी तरह से अलग विचारों को प्रदर्शित करना चाहते हैं, तो आप सिर्फ यह स्पष्ट रूप से कर सकते हैं इंडेक्स एक्शन में उदाहरण:

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 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^