2012-06-29 28 views
5

Có thể biết hệ thống tập tin Rails gốc của một ứng dụng trong mã của một viên ngọc được bao gồm trong một ứng dụng không?Làm cách nào để lấy thư mục gốc của ứng dụng Rails trong Gem

Đây là một ví dụ về các nguồn đá quý:

module MyGem 
    def self.included(base) 
    puts Rails.root # return nil 
    end 
end 

ActionController::Base.send :include, MyGem 

Thank và xin lỗi vì tôi nghèo tiếng anh

+0

Nói chuyện không được khuyến khích ở đây. Nếu bạn sẽ thêm "cảm ơn" vào bài đăng của mình (bạn không nên làm gì), hãy nhập "cảm ơn" chứ không phải "thx". – meagar

+0

Tôi đã không làm nhiều với đá quý ruby, nhưng tôi tự hỏi sẽ '' 'root_path''' không hoạt động? –

+0

Thư mục gốc của hệ thống tập tin? hoặc URL root_path? –

Trả lời

7

Giải pháp mà tôi tìm thấy để khắc phục vấn đề tương tự với điều này là bao gồm mô-đun của tôi bằng cách sử dụng bộ khởi tạo đường truyền.

Vì vậy, trong /lib/mygem/railtie.rb bạn

module MyGem 
    class Railtie < Rails::Railtie 
    initializer "Include your code in the controller" do 
     ActiveSupport.on_load(:action_controller) do 
     include MyGem 
     end 
    end 
end 

Với mã này, mô-đun của bạn sẽ được đưa vào sau khi ActionController được nạp và bạn sẽ có thể sử dụng Rails.root

Hãy cho tôi biết nếu điều này phù hợp với bạn.

+0

Có vẻ như nó hoạt động. Cảm ơn rất nhiều! – sailor

2

Dĩ nhiên:

Rails.root 

Chỉ vì bạn đang viết một viên ngọc doesn Không có nghĩa là bạn không thể truy cập vào không gian tên chung. Mối quan tâm duy nhất là nếu Gem của bạn sử dụng truy cập đó trước khi mô-đun Rails được thiết lập trong khi khởi tạo. Nếu bạn thấy đó là sự cố, hãy đăng mã bạn đang sử dụng, vị trí của nó và chúng tôi sẽ vui lòng giúp gỡ lỗi vấn đề.

+0

Rails.root trả về nil trong trường hợp đó. – sailor

+0

Điều đó không nên xảy ra. Nhiều bối cảnh hơn - là mẫu bạn đã thêm vào câu hỏi đang chạy trong một ứng dụng Rails đầy đủ, hoặc bạn đang thử nghiệm nó với RSpec hay tương tự? Khi đang trong quá trình khởi tạo, bạn đang gọi #send: include? –

+0

Nó đang chạy trong một ứng dụng Rails đầy đủ. Bao gồm được gọi khi đá quý được bao gồm, mã cơ bản là giống nhau ... – sailor

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