2011-07-01 20 views
11

Tôi đã làm việc trên plugin Rails 3 đầu tiên của mình, để đóng gói một hàm trợ giúp đơn giản mà tôi thích có trong số ApplicationHelper của tất cả các ứng dụng của tôi. Bạn có thể xem toàn bộ mã số on Github.Tạo một trình trợ giúp văn bản Rails 3 đơn giản Gem

Đây là nỗ lực đầu tiên của tôi:

## lib/semantic_id.rb ## 

require 'semantic_id/version' 

module ::ActionView::Helpers::TextHelper 

    def semantic_id 
    string = String.new 

    case 
    when controller.action_name =~ /new|edit/ 
     string += controller.action_name + "_" 
    when controller.action_name =~ /index|create/ 
     string += controller.controller_name 
    else 
     string += controller.controller_name.singularize 
    end 

    string += "_view" 
    end 

end 

Bây giờ, công trình này, nhưng như tôi hiểu nó đây không phải là 'Rails 3 Way' mở rộng ActiveSupport hoặc bất kỳ thành phần Rails khác. Tôi đã không thể tìm thấy nhiều tài liệu về cách bạn "được cho là" để xây dựng một đá quý Rails 3. Tôi đã thử theo Hướng dẫn Rails, nhưng phương pháp được đưa ra ở đó để thêm người trợ giúp đã không làm việc, hoặc người nào khác tôi đã bỏ lỡ một cái gì đó.

Câu hỏi của tôi là: được cung cấp mã ở trên làm ví dụ về chức năng mà tôi đang tìm kiếm, bạn sẽ biến điều này thành Rails 3 plugin Gem như thế nào?

Cảm ơn!

+0

bạn nên thử sử dụng viên ngọc quý trong việc tạo đá quý :) – corroded

+1

Về câu trả lời được đưa ra, tôi bị rách vì tôi dựa vào cả hai để giải quyết vấn đề này. Mã của Alex khiến tôi gần gũi, nhưng tôi vẫn đang gặp khó khăn trong việc tìm ra cách tải nó trong ứng dụng cho đến khi Noli đăng các liên kết của mình lên các ví dụ tốt hơn về cách đặt một chiếc ray với nhau. Vì vậy, cuối cùng, câu trả lời của Alex khiến tôi bắt đầu trong khi Noli giúp tôi kết thúc. Tôi phải đi với Noli trong trường hợp này, vì các liên kết của anh ấy đã tạo nên sự khác biệt ở cuối. Cảm ơn cả hai vì câu trả lời chu đáo của bạn! – Andrew

Trả lời

17

Sự cố với những gì bạn đã làm là bạn đã gắn chức năng của gem vào ActionView. Nó sẽ là tốt hơn để làm cho nó chung chung hơn.

Để khắc phục điều này, bạn nên đóng gói mã của mình trong mô-đun riêng và sau đó tiêm mô-đun đó vào môi trường chế độ xem của bạn. Ví dụ, đặt helper của bạn vào mô-đun riêng của mình (và tập tin):

# lib/semantic_id/helper.rb 

module SemanticId 
    module Helper 
    def semantic_id 
     ... 
    end 
    end 
end 

Sau đó thêm nó vào ActionView sử dụng một Railtie:

# lib/semantic_id.rb 

require 'semantic_id/helper' 

ActiveSupport.on_load(:action_view) do 
    include SemanticId::Helper 
end 

Bạn muốn tách riêng phần chức năng của helper từ một phần chèn nó vào khung. Phương pháp của bạn có chứa một số mã Rails cụ thể, nhưng nếu nó không phải là kỹ thuật này sẽ cho phép bạn sử dụng nó với Sinatra và các khung công tác khác.

Nói chung, đường ruột của dự án của bạn phải ở trong lib/<project_name>/*.rblib/<project_name>.rb sẽ chỉ làm cho chức năng có thể truy cập được.

+0

Điều này giúp, cảm ơn. – Andrew

+0

Nhưng làm cách nào bạn kiểm tra phương thức bên trong mô-đun? Bạn không phải bao gồm nó trong một lớp học? – Mohamad

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