2012-06-20 19 views
6

Mam konfigurację z modelami Cart i CartItem (belongs_to :cart).Szyny 3 ścieżka polimorficzna - jak zmienić domyślny klucz trasy

Co chcę zrobić, to zadzwonić pod numer polymorphic_path([@cart, @cart_item]), aby używał numeru cart_item_path zamiast cart_cart_item_path.

Wiem, że mogę zmienić adres URL wygenerowany przez trasę do /carts/:id/items/:id, ale to nie jest to, co mnie interesuje. Również zmiana nazwy CartItem na Item nie jest opcją. Chcę tylko użyć metody cart_item_path w całej aplikacji.

Z góry dziękuję za wszelkie wskazówki na ten temat!

Wystarczy, aby mój punkt jasne:

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

Tak, aby powtórzyć moje pytanie, co mogę zrobić, aby polymorphic_path([cart,cart.item]) szukać cart_item_path i nie cart_cart_item_path?

Odpowiedz

2

Możesz zadeklarować takie zasoby w swoim pliku tras.

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

Patrz this section of the rails guide

+0

I to jest dokładnie to, co robię. I - jeśli czytasz uważnie - to jest problem, ponieważ: '>> ścieżka app.polymorphic ([cart, cart.item])' 'NoMethodError: niezdefiniowana metoda' cart_cart_item_path 'dla # ' Tak więc, aby powtórzyć moje pytanie, co mogę zrobić, aby polymorphic_path ([cart, cart.item]), aby wyszukać cart_tem_path, a nie cart_cart_item_path? – Pandaamonium

12

Po przejściu przez całą drogę w dół stosu wywołań, wpadłem na to:

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 

Odpowiedni kod Rails jest ActiveModel::Naming#model_name i ActiveModel::Name#initialize.

Teraz wreszcie:

>> 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" 

Myślę, że sama mogłaby pracować dla Cart zamiast Cart::Cart z use_relative_model_naming? na poziomie Cart klasy.

+0

Ta odpowiedź uratowała mi dzień, dzięki! Należy zauważyć, że wpływa również na nazwy parametrów w formularzach, np. 'Cart :: Item.model_name.param_key' zmienia się z' 'cart_item'' na '' item''. –