2012-06-20 31 views
6

Tôi nhận được cấu hình với các mô hình CartCartItem (belongs_to :cart).Rails 3 polymorphic_path - cách thay đổi route_key mặc định

Điều tôi muốn làm là gọi polymorphic_path([@cart, @cart_item]) để sử dụng cart_item_path, thay vì cart_cart_item_path.

Tôi biết tôi có thể thay đổi url được tạo bởi tuyến đường thành /carts/:id/items/:id, nhưng đó không phải là điều tôi quan tâm. Ngoài ra, đổi tên CartItem thành Item không phải là một tùy chọn. Tôi chỉ muốn sử dụng phương thức cart_item_path trong suốt ứng dụng.

Cảm ơn trước cho mọi mẹo về điều đó!

Chỉ cần để làm cho quan điểm của tôi rõ ràng:

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

Vì vậy, để lặp lại câu hỏi của tôi, những gì tôi có thể làm để cho polymorphic_path([cart,cart.item]) để tìm cart_item_path và không cart_cart_item_path?

Trả lời

2

Bạn có thể khai báo các tài nguyên như thế này trong tệp tuyến đường của mình.

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

Tham khảo this section of the rails guide

+0

Và đó chính xác là những gì tôi đang làm. Và - nếu bạn đọc kỹ - đó là vấn đề, bởi vì: '>> app.polymorphic_path ([cart, cart.item])' 'NoMethodError: phương thức chưa xác định' cart_cart_item_path 'cho # ' Vì vậy, để lặp lại câu hỏi của mình, tôi có thể làm gì để cho polymorphic_path ([cart, cart.item]) tìm cart_tem_path chứ không phải cart_cart_item_path? – Pandaamonium

12

Sau khi đi tất cả các con đường xuống các cuộc gọi stack, tôi đến với điều này:

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 

Các Rails mã có liên quan là ActiveModel::Naming#model_nameActiveModel::Name#initialize.

Bây giờ cuối cùng tôi nhận được:

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

Tôi nghĩ như vậy có thể làm việc cho Cart thay vì Cart::Cart, với use_relative_model_naming? vào mức độ Cart lớp.

+0

Câu trả lời này đã cứu ngày của tôi, cảm ơn! Lưu ý rằng nó cũng ảnh hưởng đến tên thông số trong biểu mẫu, ví dụ: 'Cart :: Item.model_name.param_key' thay đổi từ' 'cart_item'' thành '' item''. –

Các vấn đề liên quan