8

Vì vậy, tôi muốn có Rails xử lý các tuyến đường địa phương cụ thể cho tôi, ví dụ:Các tuyến đường ray có phạm vi ": miền địa phương" và tài nguyên lồng nhau nông

/en/companies 
/nl/companies 

Đó hoạt động tốt với các tuyến đường nét:

scope "(:locale)", :locale => /en|nl/ do 
    resources :companies 
end 

Nhưng tại các công ty thời có nguồn lực lồng nhau cạn, như vậy:

scope "(:locale)", :locale => /en|nl/ do 
    resources :companies, :shallow => true do 
    resources :pages 
    end 
end 

đó cho phép những con đường như /en/companies/1/pages, nhưng không phải đường dẫn như /en/pages/1/edit. Kể từ khi "nông" cũng dải phần "miền địa phương" của con đường, có vẻ như tôi đang mắc kẹt với /pages/1/edit?locale=en. Không có cách nào để Rails xử lý các tài nguyên lồng nhau nông với miền địa phương theo cách mà tôi có thể sử dụng /en/pages/1/edit?

Trả lời

14

Ah, vâng! Tôi đã tìm thấy câu trả lời trong the API documentation. Sự kỳ diệu là vào từ khóa :shallow_path và trong ví dụ trên nó hoạt động như sau:

scope :path => "(:locale)", :shallow_path => "(:locale)", :locale => /en|nl/ do 
    resources :companies, :shallow => true do 
    resources :pages 
    end 
end 

Bây giờ một URL như /en/pages/1/edit công trình một cách hoàn hảo!

3

Cảm ơn Pascal rất nhiều, điều này thực sự hữu ích đối với tôi. Tôi nhận thấy một hành vi tương tự khi thiết lập tài nguyên lồng nhau của tôi.

Tôi sẽ thêm điều gì đó, tùy chọn sử dụng câu lệnh chặn cho nông thay vì tham số. Ngay bây giờ bằng cách sử dụng cú pháp bạn đã đưa ra, chỉ có hậu duệ trực tiếp (: trang) sẽ cạn.

Nếu có cơ hội nào bạn muốn tổ một mức độ sâu hơn (hãy tạm bỏ qua đối số về việc liệu đây là thông lệ tốt nhất hay không), sử dụng một khối cạn sẽ thực sự nông cạn như sâu khi cần thiết:

resources :users do 
    shallow do 
    resources :categories do 
     resources :sections do 
     resources :pages 
     end 
    end 
    resources :news 
    end 
end 

Dưới đây là ví dụ về những người trợ giúp tuyến đường có sẵn mà bạn sẽ có cho tất cả các tài nguyên được lồng trong: người dùng

new_category_section GET (/:locale)(/:locale)/categorys/:category_id/sections/new(.:format)  {:locale=>/fr|en/, :action=>"new", :controller=>"sections"} 
edit_section   GET (/:locale)(/:locale)/sections/:id/edit(.:format)      {:locale=>/fr|en/, :action=>"edit", :controller=>"sections"} 
section    GET (/:locale)(/:locale)/sections/:id(.:format)       {:locale=>/fr|en/, :action=>"show", :controller=>"sections"} 
         PUT (/:locale)(/:locale)/sections/:id(.:format)       {:locale=>/fr|en/, :action=>"update", :controller=>"sections"} 
         DELETE (/:locale)(/:locale)/sections/:id(.:format)       {:locale=>/fr|en/, :action=>"destroy", :controller=>"sections"} 

    section_pages  GET (/:locale)(/:locale)/sections/:section_id/pages(.:format)    {:locale=>/fr|en/, :action=>"index", :controller=>"pages"} 
         POST (/:locale)(/:locale)/sections/:section_id/pages(.:format)    {:locale=>/fr|en/, :action=>"create", :controller=>"pages"} 
new_section_info_page GET (/:locale)(/:locale)/sections/:section_id/pages/new(.:format)   {:locale=>/fr|en/, :action=>"new", :controller=>"pages"} 
     dit_info_page GET (/:locale)(/:locale)/pages/:id/edit(.:format)       {:locale=>/fr|en/, :action=>"edit", :controller=>"pages"} 
      info_page GET (/:locale)(/:locale)/pages/:id(.:format)        {:locale=>/fr|en/, :action=>"show", :controller=>"pages"} 
         PUT (/:locale)(/:locale)/pages/:id(.:format)        {:locale=>/fr|en/, :action=>"update", :controller=>"pages"} 
         DELETE (/:locale)(/:locale)/pages/:id(.:format)        {:locale=>/fr|en/, :action=>"destroy", :controller=>"pages"} 
+0

Cái nhìn sâu sắc thú vị Olivier. Cảm ơn! –

+0

Cảm ơn, Olivier, về mẹo "nông cạn" của bạn! Đó chỉ là những gì tôi đang tìm kiếm ... – jgpawletko

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