2012-06-20 96 views
6

我得到了配置CartCartItembelongs_to :cart)模型。Rails 3 polymorphic_path - 如何更改默認route_key

我想要做的就是致電polymorphic_path([@cart, @cart_item]),以便它使用cart_item_path而不是cart_cart_item_path

我知道我可以將路由生成的url更改爲/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,cart.item])' 'NoMethodError:未定義方法'cart_cart_item_path'for#' 因此,重複我的問題,我可以做些什麼,以便爲polymorphic_path([cart,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 

相關的Rails代碼爲ActiveModel::Naming#model_nameActiveModel::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,而不是Cart::Cart工作,具有use_relative_model_naming?Cart一流水平。

+0

這個答案拯救了我的一天,謝謝!請注意,它也影響表單中的參數名稱,例如'Cart :: Item.model_name.param_key'從'cart_item''變爲''item''。 –

相關問題