2015-08-01 13 views
6

Tôi có tài nguyên lồng nhau Bar thuộc về Foo. Tôi có thể liệt kê thành công tất cả các đối tượng Bar thuộc về bất kỳ Foo nào. Nhưng tôi cũng muốn có thể tạo chế độ xem với tất cả các mục Bar được liệt kê cùng nhau, từ bất kỳ đối tượng nào thuộc về Foo.Rails 4 - làm cách nào để thêm tuyến đường chỉ mục cho tài nguyên lồng nhau, để liệt kê tất cả các mục độc lập với tài nguyên mẹ

Cấu trúc mô hình là:

# app/models/foo.rb 
class Foo < ActiveRecord 
    has_many :bars 
end 

# app/models/bar.rb 
class Bar < ActiveRecord 
    belongs_to :foo 
end 

Các tuyến được định nghĩa là:

# config/routes.rb 
resources :foos do 
    resources :bars 
end 

tôi nhận được các tuyến đường dự kiến ​​từ cấu hình này:

foo_bars GET /foos/:foo_id/bars(.:format)  bars#index 
      POST /foos/:foo_id/bars(.:format)  bars#create 
new_foo_bar GET /foos/:foo_id/bars/new(.:format) bars#new 
    edit_bar GET /bars/:id/edit(.:format)   bars#edit 
     bar GET /bars/:id(.:format)    bars#show 
      PATCH /bars/:id(.:format)    bars#update 
      PUT /bars/:id(.:format)    bars#update 
      DELETE /bars/:id(.:format)    bars#destroy 
     foos GET /foos(.:format)     foos#index 
      POST /foos(.:format)     foos#create 
    new_foo GET /foos/new(.:format)    foos#new 
    edit_foo GET /foos/:id/edit(.:format)   foos#edit 
     foo GET /foos/:id(.:format)    foos#show 
      PATCH /foos/:id(.:format)    foos#update 
      PUT /foos/:id(.:format)    foos#update 
      DELETE /foos/:id(.:format)    foos#destroy 

Những gì tôi cần là tạo tuyến đường cho bars#index không được đặt trong phạm vi của foo. Nói cách khác, tôi về cơ bản muốn:

bars GET /bars(.:format)  bars#index 

Tôi đã thử bằng cách sử dụng tùy chọn cạn, như sau:

# config/routes.rb 
resources :foos, shallow: true do 
    resources :bars 
end 

Tuy nhiên, điều này không hỗ trợ: action index, theo documentation.

Cách tốt nhất để làm điều này là gì? Có một cuộc thảo luận Stack Overflow hữu ích here, sử dụng before_filter để xác định phạm vi - nhưng từ năm 2009. Đánh giá cao bất kỳ hướng dẫn cụ thể nào về cách thiết lập cả bộ điều khiển và tệp config/routes.rb một cách thích hợp!

+0

Thêm 'tài nguyên: thanh' riêng biệt không hoạt động? –

Trả lời

4

Nếu bạn muốn giữ lại các phương pháp scoped index foo_bars và một bars tuyến đường riêng biệt/xem:

Tạo một lộ trình tùy chỉnh trong routes.rb:

get 'bars' => 'bars#index', as: :bars 

Thiết lập phương pháp chỉ số của bạn trong điều khiển bars của bạn như được mô tả trong liên kết của bạn hoặc chỉ đơn giản là:

def index 
    if params[:foo_id] 
    @bars = Foo.find(params[:foo_id]).bars 
    else 
    @bars = Bar.all 
    end 
end 

Sau đó tạo một thư mục xem bars ectory (nếu bạn không có) và index.html.erb.


Nếu bạn không muốn giữ lại phương pháp chỉ số scoped foo_bars:

Tạo một lộ trình tùy chỉnh trong routes.rb:

get 'bars' => 'bars#index', as: :bars 

Chỉnh sửa các tuyến đường hiện tại của bạn để loại trừ các chỉ số lồng nhau:

resources :foos do 
    resources :bars, except: :index 
end 

Sau đó, bars contr Oller chỉ có thể là:

def index 
    @bars = Bar.all 
end 

Sau đó tạo một thư mục bars view (nếu bạn không có một) và index.html.erb.

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