2012-06-20 8 views
6

को बदलने के लिए कैसे मुझे Cart और CartItem (belongs_to :cart) मॉडल के साथ कॉन्फ़िगर मिला।रेल 3 polymorphic_path - डिफ़ॉल्ट रूट_की

मैं क्या करना चाहता हूं polymorphic_path([@cart, @cart_item]) पर कॉल करना है ताकि cart_cart_item_path के बजाय cart_item_path का उपयोग किया जा सके।

मुझे पता है कि मैं मार्ग से उत्पन्न यूआरएल /carts/:id/items/:id पर बदल सकता हूं, लेकिन यह मेरी दिलचस्पी नहीं है। इसके अलावा, CartItem से Item का नाम बदलना एक विकल्प नहीं है। मैं बस पूरे ऐप में cart_item_path विधि का उपयोग करना चाहता हूं।

उस पर किसी भी टिप के लिए अग्रिम धन्यवाद!

बस मेरी बात स्पष्ट कर देना:

>> app.polymorphic_path([cart, cart_item]) 
NoMethodError: undefined method `cart_cart_item_path' for #<ActionDispatch::Integration::Session:0x007fb543e19858> 

तो, मेरे सवाल दोहराने के लिए, मैं क्या polymorphic_path([cart,cart.item]) के क्रम में कर सकते हैं cart_item_path और नहीं cart_cart_item_path देखने के लिए?

उत्तर

2

आप इस तरह के संसाधनों को अपनी मार्ग फ़ाइल में घोषित कर सकते हैं।

resources :carts do 
    resources :cart_items, :as => 'items' 
end 

कॉल स्टैक नीचे सभी तरह से जाने के बाद this section of the rails guide

+0

और यह वही है, जो मैं कर रहा हूं। और - यदि आप ध्यान से पढ़ते हैं - यह समस्या है, क्योंकि: '>> app.polymorphic_path ([कार्ट, cart.item])' 'NoMethodError: # ' तो, मेरे प्रश्न को दोहराने के लिए, मैं polymorphic_path ([कार्ट, cart.item]) के लिए cart_tem_path को देखने के लिए क्या कर सकता हूं और cart_cart_item_path नहीं? – Pandaamonium

12

को देखें, मैं इस के साथ आया था:

module Cart  
    class Cart < ActiveRecord::Base 
    end 

    class Item < ActiveRecord::Base 
    self.table_name = 'cart_items' 
    end 

    def self.use_relative_model_naming? 
    true 
    end 

    # use_relative_model_naming? for rails 3.1 
    def self._railtie 
    true 
    end 
end 

प्रासंगिक रेल कोड ActiveModel::Naming#model_name और ActiveModel::Name#initialize है।

अब मैं अंत में मिलता है:

>> cart.class 
=> Cart::Cart(id: integer, created_at: datetime, updated_at: datetime) 
>> cart_item.class 
=> Cart::Item(id: integer, created_at: datetime, updated_at: datetime) 
>> app.polymorphic_path([cart, cart_item]) 
=> "/carts/3/items/1" 
>> app.send(:build_named_route_call, [cart, cart_item], :singular) 
=> "cart_item_url" 

मुझे लगता है कि एक ही Cart वर्ग स्तर पर use_relative_model_naming? साथ, Cart बजाय Cart::Cart के लिए काम कर सकता था।

+0

इस उत्तर ने मेरा दिन बचाया, धन्यवाद! ध्यान दें कि यह रूपों में पैरामीटर नामों को भी प्रभावित करता है, उदा। 'कार्ट :: item.model_name.param_key'' cart_item'' से 'item'' में परिवर्तन। –

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