2010-11-19 32 views
31

Tôi đã tạo một số bộ điều khiển & chế độ xem dưới tên miền 'quản trị', nhưng chúng vẫn đang kéo từ bố cục ứng dụng. làm cách nào tôi có thể tạo bố cục áp dụng cho tất cả các chế độ xem trong các tuyến đường không gian tên và vẫn sử dụng bố cục hiện tại cho các trang khác?đường ray 3: bố trí cho các tuyến đường có tên

Trả lời

36

Nói chung, Rails sẽ sử dụng bố cục ứng dụng nếu không có bố cục phù hợp với bộ điều khiển. Ví dụ, nếu bạn có một PeopleController, Rails sẽ tìm các layout/people.html.erb và nếu nó không tìm thấy điều đó, application.html.erb.

Bạn có thể chỉ định rõ bố cục cụ thể nếu bạn muốn ghi đè quy ước này.

class Admin::PeopleController 
    layout 'some_layout' 
end 

Bộ điều khiển đó sẽ sử dụng some_layout.html.erb thay vì tìm kiếm people.html.erb và application.html.erb.

Nhưng đây có thể là cách tốt hơn nếu bạn đang tìm cách nhóm mọi thứ: Nếu bạn có một AdminController cơ sở kế thừa từ ApplicationController, bạn có thể có, Admin, PersonController kế thừa từ AdminController và nó sẽ kế thừa bố cục quản trị.

Tôi không biết các chi tiết cụ thể của mã của bạn, nhưng bạn có thể có:

class AdminController 
    def show 
    #render a template linking to all the admin stuff 
    end 
end 

app/controllers/admin/people_controller.rb: 
class Admin::PeopleController < AdminController 
    #your awesome restful actions in here! 
end 

views/layouts/admin.html.erb: 
Hello from the Admin! 
<%= yield %> 

Một điều cần nhận thức được rằng Quản trị :: PeopleController sẽ thừa hưởng bất kỳ hành động mà AdminController đã xác định (cũng giống như bất cứ điều gì được định nghĩa trong ApplicationController sẽ có sẵn trong tất cả các lớp con). Đây không phải là vấn đề thường gặp vì bạn có thể sẽ ghi đè lên các phương thức, nhưng chỉ để ý thức về nó. Nếu bạn không có AdminController, bạn có thể tạo một hành động không có hành động chỉ vì mục đích của bố cục.

+2

Lớp 'AdminController' nằm trong' app/controllers' hoặc 'app/controllers/admin'? – jdscosta91

+0

dưới 'ứng dụng/bộ điều khiển ' – Damien

+0

Tôi đang thử điều này, và có vẻ như nó hoạt động, nhưng tôi bị mất các kiểu và chức năng được đưa ra bởi các khung công tác như Bootstrap hoặc Semantic-UI. Bất kỳ ý tưởng làm thế nào để giải quyết điều này? – Sebastialonso

40

Tôi thường có một lớp bộ điều khiển cơ sở trong không gian tên của tôi, và sau đó có tất cả các bộ điều khiển trong không gian tên đó kế thừa từ nó. Điều đó cho phép tôi đặt chung, không gian tên mã cụ thể trong cơ sở và tất cả các bộ điều khiển trong không gian tên đó có thể tận dụng lợi thế. Ví dụ:

class Admin::BaseController < ApplicationController 
    layout 'admin' 
    before_filter :require_admin_user 
end 

class Admin::WidgetsController < Admin::BaseController 
    # inherits the 'admin' layout and requires an admin user 
end 
+2

Tôi nghĩ điều này thanh lịch và có cấu trúc hơn câu trả lời được chấp nhận. Có cách nào để làm cho tất cả các bộ điều khiển được tạo ra bởi lệnh 'rails g' để kế thừa từ' Admin :: BaseController'? – berezovskyi

+0

Bộ điều khiển cơ sở này nên đi đâu? – Sebastialonso

+3

Lớp điều khiển là Admin :: BaseController, do đó Rails giả sử nó sẽ được định nghĩa trong tệp base_controller.rb trong thư mục controllers/admin. – IAmNaN

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