2015-08-07 15 views
6

Tôi đang viết một công cụ Rails có thể định cấu hình. Tôi có một tùy chọn cấu hình authentication_helper để xác định trình trợ giúp nào nên được gọi trong một before_action trong tất cả các trình điều khiển cần xác thực.Truy cập người trợ giúp từ ứng dụng gốc trong công cụ Rails bị cô lập

Vấn đề là tôi không có quyền truy cập vào trình trợ giúp của ứng dụng mẹ từ bộ điều khiển của động cơ. My understanding là điều này xảy ra vì động cơ bị cô lập.

Tôi đã xem xét sử dụng một khối thay vì tên phương thức, nhưng tôi không chắc liệu điều đó có hiệu quả không, hoặc nếu tôi có thể truy cập logic ủy quyền từ bên ngoài bộ điều khiển của tôi.

Active Admin, mà tôi đã sử dụng trong quá khứ, có tùy chọn cấu hình tương tự. Tôi đã nhận thấy rằng động cơ của họ không bị cô lập, vì vậy có lẽ tôi đang vượt qua tầm quan trọng của sự cô lập động cơ?

Có cách nào thanh lịch để có được lợi ích của việc cô lập động cơ trong khi cũng cho phép loại tùy chỉnh này không? Hay tôi chỉ nên bỏ qua cô lập hoàn toàn?

EDIT # 1

Brad Werth chỉ tôi đi đúng hướng, vì điều này làm việc với một bộ điều khiển thường xuyên kế thừa từ ApplicationController::Base:

module MyBigFancyEngine 
    class Engine < Rails::Engine 

    isolate_namespace MyBigFancyEngine 

    config.to_prepare do 
     # Make the implementing application's helpers available to the engine. 
     # This is required for the overriding of engine views and helpers to work correctly. 
     MyBigFancyEngine::ApplicationController.helper Rails.application.helpers 
    end 

    end 
end 

Tuy nhiên, ApplicationController kế thừa động cơ của tôi từ RocketPant::Base, mà không cung cấp phương thức helper. Tôi đã cố gắng sử dụng một đơn giản include (hoạt động tốt cho bộ điều khiển thông thường), nhưng điều đó không làm việc hoặc là (bộ điều khiển không thể tìm thấy người trợ giúp).

Bất kỳ ý tưởng nào?

+0

bạn đã thử phương pháp tiếp cận của mình chưa? bạn đã có một cái nhìn? –

Trả lời

2

các RailsAdmin Động cơ cũng được cô lập, nhưng họ có những lựa chọn cấu hình tương tự ion như bạn muốn thực hiện. Họ có cấu hình before_filters cho cả hai xác thực và ủy quyền. Hãy xem this.

Theo như tôi có thể biết, họ chỉ phân lớp bộ điều khiển gốc như thế này ::ApplicationController hoặc thay vào đó bạn có thể định cấu hình một (ref). Đối với bộ điều khiển, bạn chỉ có thể tạo EngineController của riêng mình, kế thừa từ RocketPant::Base và có thể chỉ cần tạo phương thức ở đó gọi phương thức xác thực được định cấu hình trực tiếp qua send trên bộ điều khiển chính.

Khi lớp RocketPant::Base Lớp học không kế thừa từ ApplicationController::Base Tôi đoán bạn phải tìm một số cách tùy chỉnh xung quanh việc này và không thể đi theo các cách thông thường cho Rails Engines. Có lẽ bạn cũng có thể thử gửi một vấn đề cho repo rocket_pant, để thêm phương thức helper. Theo như tôi đọc, chẳng mấy chốc họ muốn kế thừa từ ApplicationController::Base dù sao trong 2.0 (ref).

+0

Phân lớp bộ điều khiển chính dường như hoạt động. Cảm ơn! –

+0

Rất tệ khi tiền thưởng đã hết hạn. :( –

+0

Vâng, xin lỗi về điều đó.Tôi đã có rất nhiều đang xảy ra và không tìm thấy thời gian để thử giải pháp của bạn cho đến sau khi tiền thưởng đã hết hạn :( –

0

Tôi nghĩ rằng bạn thúc đẩy việc giữ sự cô lập là tốt - bởi vì một giải pháp dựa vào một phương pháp 'đang ở đó' là một nỗi đau để gỡ lỗi nếu s.th. đi sai trong ứng dụng bằng cách sử dụng đá quý của bạn (ví dụ: typo trong tên phương thức).

Hơn nữa nếu đá quý của bạn phát triển, một số ngày nó sẽ không cần phương pháp, một cách rõ ràng nó rất tiện lợi để cung cấp cho một lỗi meainingful:

Bạn có thể cung cấp một phương pháp cấu hình được gọi trong một initializer :

YourGem.configure do |config| 
    config.add_callback { MyApp.doIt() } 
end 
0

Tôi tìm thấy điều này discussion particularly insightful. Ngoài ra còn có một số ý tưởng thú vị trong số Rails Engine API trong bộ phận trợ giúp của động cơ Isolated.

Các tài liệu Rails cơ API giúp tôi tìm ra một giải pháp tốt cho url_helpers

5

Bạn có thể tiếp xúc với những người giúp đỡ việc áp dụng thực hiện của có sẵn cho động cơ bằng cách bao gồm đoạn mã sau vào tập tin engine.rb của bạn:

engine.rb

module MyBigFancyEngine 
    class Engine < Rails::Engine 

    isolate_namespace MyBigFancyEngine 

    config.to_prepare do 
     # Make the implementing application's helpers available to the engine. 
     # This is required for the overriding of engine views and helpers to work correctly. 
     MyBigFancyEngine::ApplicationController.helper Rails.application.helpers 
    end 

    end 
end 
+0

Cảm ơn! Điều đó làm việc với một bộ điều khiển thông thường, nhưng tôi đang sử dụng RocketPants và gặp một số rắc rối. Tôi đã cập nhật câu hỏi gốc. Bạn có bất cứ ý tưởng? –

+0

@AlessandroDesantis Bạn có thể bao gồm ActionController :: Helpers trong bộ điều khiển của bạn không? –

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