2012-06-20 24 views
6

Cart ve CartItem (belongs_to :cart) modelleriyle bir yapılandırmam var.Raylar 3 polymorphic_path - varsayılan rota_key'i nasıl değiştirilir

Yapmak istediğim, cart_cart_item_path yerine cart_item_path kullanması için polymorphic_path([@cart, @cart_item]) numaralı telefonu aramaktır.

Rotanın oluşturduğu URL'yi /carts/:id/items/:id olarak değiştirebileceğimi biliyorum, ancak ilgilendiğim şey bu değil. Ayrıca, CartItem'un Item'a yeniden adlandırılması bir seçenek değil. Sadece uygulama boyunca cart_item_path yöntemini kullanmak istiyorum.

Bu konuda herhangi bir ipucu için şimdiden teşekkür ederiz!

Sadece benim açımdan netleştirmek için:

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

, sorumu tekrarlamak, ben cart_item_path değil cart_cart_item_path aramaya polymorphic_path([cart,cart.item]) için sırayla ne yapabilirim?

cevap

2

Bu gibi kaynakları rota dosyanızda bildirebilirsiniz.

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

çağrı yığını aşağı tüm yol gittikten sonra this section of the rails guide

+0

Ve tam olarak ne yapıyorum. Ve - eğer dikkatlice okuyorsanız - sorun şu, çünkü: >> uygulama.polymorphic_path Oturum: 0x007fb543e19858> Sorunu tekrarlamak için, polymorphic_path ([cart, cart.item]) için cart_tem_path yerine cart_cart_item_path aramasının yapılabilmesi için ne yapabilirim? – Pandaamonium

12

bakın, ben bu geldi:

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 

ilgili Raylar kod ActiveModel::Naming#model_name ve ActiveModel::Name#initialize olduğunu.

Şimdi nihayet olsun:
>> 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" 

aynı Cart sınıf düzeyinde use_relative_model_naming? ile Cart yerine Cart::Cart için işe yarayabilir.

+0

Bu cevap günümü kurtardı, teşekkürler! Ayrıca, formlardaki parametre adlarını da etkilediğini unutmayın, ör. 'Cart :: Item.model_name.param_key', 'cart_item' 'den' 'item' '' e değişir. –

İlgili konular