2015-04-22 6 views
6

मैं नीचे के रूप में संसाधनों नेस्ट हैरेल: नेस्टेड संसाधनों के लिए मार्ग सहायकों

resources :categories do 
    resources :products 
end 

Rails Guides के अनुसार,

तुम भी वस्तुओं का एक सेट के साथ url_for उपयोग कर सकते हैं, और रेल स्वचालित रूप से होगा निर्धारित करें कि आप कौन सा मार्ग चाहते हैं:

<%= link_to 'Ad details', url_for([@magazine, @ad]) %> 

इस मामले में, रेल देखेंगे कि @ मैगज़ीन एक पत्रिका है और @ad एक है एन विज्ञापन और इसलिए magazine_ad_path सहायक का उपयोग करेंगे। LINK_TO तरह सहायकों में, आप पूर्ण url_for कॉल के स्थान पर सिर्फ वस्तु निर्दिष्ट कर सकते हैं:

<%= link_to 'Edit Ad', [:edit, @magazine, @ad] %> 
:

<%= link_to 'Ad details', [@magazine, @ad] %> 

अन्य कार्यों के लिए, आप बस सरणी के पहले तत्व के रूप में कार्रवाई का नाम डालने की आवश्यकता जाहिर है यह एक छोटे भी ver है

<% @products.each do |product| %> 
    <tr> 
    <td><%= product.name %></td> 
    <td><%= link_to 'Show', category_product_path(product, category_id: product.category_id) %></td> 
    <td><%= link_to 'Edit', edit_category_product_path(product, category_id: product.category_id) %></td> 
    <td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

:

मेरे मामले में, मैं निम्नलिखित कोड है जो पूरी तरह से कार्य किया गया है बोस और मैं रेल गाइड से ऊपर वर्णित चाल का उपयोग करके इसे छोटा करना चाहता था।

लेकिन अगर मैं बदल के रूप में निम्नानुसार दिखाएँ और संपादित लिंक:

<% @products.each do |product| %> 
    <tr> 
    <td><%= product.name %></td> 
    <td><%= link_to 'Show', [product, product.category_id] %></td> 
    <td><%= link_to 'Edit', [:edit, product, product.category_id] %></td> 
    <td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 
उनमें से न तो

किसी भी अधिक काम करता है, और पृष्ठों एक ही बात की शिकायत है:

NoMethodError in Products#index 
Showing /root/Projects/foo/app/views/products/index.html.erb where line #16 raised: 

undefined method `persisted?' for 3:Fixnum 

क्या क्या मुझे याद आया?

+2

क्या यह काम करता है यदि आप '[product, product.category]' ('दिखाएँ' url के लिए) करते हैं? –

उत्तर

5

जिस तरह से रेल 'स्वचालित रूप से' है, यह जानकर कि किस मार्ग का उपयोग करना है, वह उन वस्तुओं का निरीक्षण करके है जो आप अपनी कक्षाओं के लिए पास करते हैं, और फिर एक नियंत्रक की तलाश करते हैं जिसका नाम मेल खाता है। तो आपको यह सुनिश्चित करने की ज़रूरत है कि link_to सहायक में आप जो भी गुजर रहे हैं वह असली मॉडल ऑब्जेक्ट है, और category_id जैसी कुछ नहीं है जो कि केवल fixnum है और इसलिए कोई संबद्ध नियंत्रक नहीं है।

<% @products.each do |product| %> 
    <tr> 
    <td><%= product.name %></td> 
    <td><%= link_to 'Show', [product.category, product] %></td> 
    <td><%= link_to 'Edit', [:edit, product.category, product] %></td> 
    <td><%= link_to 'Destroy', [product.category, product], method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 
+1

धन्यवाद आपकी व्याख्या पूरी तरह से समझ में आता है! पहला दो पूरी तरह से काम करता है, अंतिम के अलावा और यह '<% = link_to 'Destroy', [product.category, product], विधि होना चाहिए:: हटाएं, डेटा: {पुष्टि करें: 'क्या आप निश्चित हैं?' }%> ', या यह ** delete_category_product_path ** चालू हो जाएगा जो मौजूद नहीं है। – jwong

+1

दोह! इसे प्रतिबिंबित करने के लिए संपादित! –

4

मैं हमलावर लाइन अनुमान लगा रहा हूँ इन में से एक है:

<td><%= link_to 'Show', [product, product.category_id] %></td> 
<td><%= link_to 'Edit', [:edit, product, product.category_id] %></td> 

product.category_id एक Fixnum है और मार्ग में पता नहीं कर सकते हैं कि एक यादृच्छिक संख्या category_id करने के लिए नक्शे माना जाता है।

आपके पिछले यूआरएल का उपयोग करें, वे अधिक पठनीय हैं।

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