2012-04-06 37 views
18

Tôi đang cố gắng hiểu cách Rails 3.2 áp dụng bố trí khi sử dụng các công cụ có thể lắp.Rails 3.2 Bố cục động cơ

Tình huống: Tôi đang xây dựng một công cụ có chế độ xem bảng điều khiển và chế độ xem quản trị viên cho các chức năng quản trị khác nhau. Tôi muốn bảng điều khiển có bố trí của nó overridable bởi các ứng dụng cơ sở (nếu người dùng mong muốn) nhưng admin nên luôn luôn sử dụng bố trí riêng của mình.

Đây là những gì tôi có vào lúc này bên trong động cơ của mình;

application_controller.rb

module Myengine 
    class ApplicationController < ActionController::Base 

admin/dashboard_controller.rb

module Myengine                           
    class Admin::DashboardController < ApplicationController 

bây giờ tôi có động cơ của tôi application.html.erb áp dụng một nền đỏ gớm ghiếc trong khi các ứng dụng cơ sở application.html.erb sử dụng nền màu vàng dễ chịu để tôi có thể phân biệt bố cục ứng dụng nào đang được áp dụng. Trong tình huống này, nếu tôi truy cập vào ứng dụng cơ sở đầu tiên tôi thấy nền màu vàng của tôi (từ ứng dụng cơ bản) và nếu tôi đi đến cả đường dẫn quản trị động cơ và đường dẫn quản trị động cơ thì nền màu vàng vẫn còn.

Nếu tôi khởi động lại máy chủ và truy cập công cụ trước thì tôi sẽ thấy nền đỏ cho công cụ và đường dẫn quản trị công cụ trong khi ứng dụng cơ sở hiển thị nền màu vàng.

Nếu tôi sửa đổi quản trị viên/dashboard_controller.rb của mình như sau;

module Myengine 
    class Admin::DashboardController < ApplicationController 
    layout 'myengine/application' 

mà tôi mong muốn chỉ áp dụng cho bộ điều khiển công cụ/quản trị viên - nhưng nếu tôi khởi động lại máy chủ và truy cập đường dẫn động cơ/quản trị tôi thấy nền đỏ trong khi chế độ xem gốc của công cụ sử dụng ứng dụng cơ sở bố cục màu vàng.

Nếu tôi khởi động lại máy chủ lần nữa và truy cập thư mục gốc của công cụ được gắn, tôi sẽ áp dụng nền màu đỏ còn lại trên đường dẫn quản trị công cụ.

Aaaaarggggghhhhh!

Hành vi dự kiến ​​có bố cục khác nhau của ứng dụng được sử dụng tùy theo đường dẫn của ứng dụng được truy cập trước không? Chắc chắn không ?? Tôi phải làm việc gì đó sai lầm!

+0

tôi nhận thấy hành vi tương tự với https://github.com/grigio/rails_container_and_engines :(nhưng tôi thêm chủ đề động cơ đến main_app một với < % = stylesheet_link_tag request.env ["action_dispatch.routes"]. routes.routes [0] .defaults [: controller],: media => "all"%> – grigio

Trả lời

15

Tôi đã gỡ lỗi sự cố và thực ra đó không phải là lỗi trong Công cụ. Vấn đề là do cách phụ thuộc đường ray được tải.

Mã này sẽ hành xử khác nhau trong 2 kịch bản mà bạn đang hiển thị:

module Enginedemo 
    class DashboardController < ApplicationController 
    end 
end 

Nếu ApplicationController đã được nạp, đường ray sẽ cho rằng chúng tôi chỉ muốn sử dụng nó và bạn sẽ thực sự không kế thừa từ Enginedemo::ApplicationController nhưng từ ApplicationController. Trong trường hợp khác, khi bạn lần đầu tiên tải bộ điều khiển của động cơ, ApplicationController chưa được tải, vì vậy Rails làm điều đúng.

Rất may sự cố này chỉ xảy ra trong môi trường phát triển như trong bộ điều khiển sản xuất được tải khi ứng dụng khởi động.

Tôi không chắc liệu đây có phải là thứ có thể dễ dàng sửa trong phụ thuộc đường ray hay không, tôi sẽ xem xét nó.

Bây giờ, hãy yêu cầu một cách rõ ràng điều khiển ứng dụng:

require 'enginedemo/application_controller' 

module Enginedemo 
    class DashboardController < ApplicationController 
    end 
end 
+18

Hoặc, cách khác, tham khảo hằng số bên phải: 'class DashboardController < Enginedemo :: ApplicationController', do đó bạn không cần phải tải nó một cách rõ ràng ở mọi nơi –

+1

Cảm ơn, tôi đã gặp vấn đề tương tự trên Rails 4.2.1 Ba năm sau câu trả lời vẫn còn rất hữu ích – dusan

+0

Tôi ar macro 'require_dependency' cũng có thể sử dụng thay cho các yêu cầu này. – Epigene

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