2012-06-20 14 views
6

Obtuve una configuración con los modelos Cart y CartItem (belongs_to :cart).Rails 3 polymorphic_path: cómo cambiar la ruta_key predeterminada

Lo que quiero hacer es llamar al polymorphic_path([@cart, @cart_item]) para que use cart_item_path, en lugar de cart_cart_item_path.

Sé que puedo cambiar la URL generada por la ruta al /carts/:id/items/:id, pero eso no es lo que me interesa. Además, cambiar el nombre CartItem al Item no es una opción. Solo quiero usar el método cart_item_path en toda la aplicación.

¡Gracias de antemano por cualquier consejo al respecto!

Sólo para hacer mi punto claro:

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

Así, para repetir mi pregunta, ¿qué puedo hacer para que polymorphic_path([cart,cart.item]) a buscar y no cart_item_pathcart_cart_item_path?

Respuesta

2

Puede declarar los recursos como este en su archivo de rutas.

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

Consulte this section of the rails guide

+0

Y eso es exactamente, lo que estoy haciendo. Y, si lo lee con cuidado, ese es el problema, porque: '>> app.polymorphic_path ([carro, carro.índice])' 'NoMethodError: método indefinido' cart_cart_item_path 'para # ' Entonces, para repetir mi pregunta, ¿qué puedo hacer para que polymorphic_path ([carrito, carro.item]) busque cart_tem_path y no cart_cart_item_path? – Pandaamonium

12

Después de pasar todo el camino hasta la pila de llamadas, se me ocurrió esto:

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 

El código rieles relevante es ActiveModel::Naming#model_name y ActiveModel::Name#initialize.

Ahora finalmente obtenemos:

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

creo que el mismo podría funcionar para Cart en lugar de Cart::Cart, con use_relative_model_naming? en el nivel Cart clase.

+0

Esta respuesta me salvó el día, ¡gracias! Tenga en cuenta que también afecta los nombres de los parámetros en los formularios, p. 'Cart :: Item.model_name.param_key' cambia de' 'cart_item'' a '' item''. –

Cuestiones relacionadas