2010-04-22 25 views
14

Thực hành tốt nhất để ghi đè lên một phương pháp lớp của đá quý trong ứng dụng đường ray? . Tôi cần phải ghi đè lên hành vi của phương pháp tìm kiếm của một viên ngọc.Làm thế nào để ghi đè lên một phương pháp lớp của đá quý trong ứng dụng đường ray?

Sau đây là mã trong viên ngọc

module Youtube 
    class display 
    attr_accessor :base 
     def find(id, options = {}) 
     detailed = convert_to_number(options.delete(:detailed)) 
     options[:detailed] = detailed unless detailed.nil? 
     base.send :get, "/get_youtube", options.merge(:youtube_id => id) 
    end 
    end 
end 

Làm thế nào để tôi ghi đè lên các phương pháp tìm ở trên trong điều khiển YoutubeSearch của tôi về Rails ứng dụng?

def find(id, options = {}) 
    //Code here  
    end 

Trả lời

26

Tạo một file rb trong config/initializers thư mục với đoạn mã sau:

Youtube::display.class_eval do 
    def find(id, options = {}) 
    //Code here  
    end 
end 
+0

Cảm ơn trả lời của bạn khi tôi đã cố gắng mã của bạn tôi đi lỗi này khi tôi bắt đầu một trường hợp thú lai 'load_missing_constant': uninitialized liên tục Youtube (NameError) –

+0

Điều này là lạ, bởi vì initializers được thực hiện sau khi tất cả các plugin và đá quý được nạp. Bạn có chắc là không có lỗi đánh máy (như YouTube) không? Nếu không có, hãy thử 'require' ing tập tin với lớp 'Youtube :: display' trong phần đầu của bộ khởi tạo. –

+0

yêu cầu bị thiếu và cũng Lỗi Typo, khởi tạo tải trước khi tất cả đá quý được nạp Cảm ơn –

-2

Tôi đã xây dựng như một giải pháp mà KHÔNG yêu cầu máy chủ khởi động lại Rails sau mỗi lần thay đổi mã (không giống như tất cả các giải pháp của người khác):

1. Tạo YoutubeHelper.rb

module YoutubeHelper 

    include Youtube 

    def init_youtube_helper 

    display.class_eval do 
     def find(id, options = {}) 
     //Code here  
     end 
    end 

    end 

end 

2. youtube_search_controller.rb

class YoutubeSearchController < ActionController::Base 
    include YoutubeHelper  
    before_action :init_youtube_helper 
end 
+0

Chăm sóc để xây dựng thêm một chút? – RamenChef

+0

chính xác hơn là gì? – prograils

+0

Có, cách tiếp cận này không hiệu quả - nhưng tôi chưa tìm được cách nào tốt hơn. Đặt mã này vào initializers (như mọi người làm) là tồi tệ hơn nhiều (có nghĩa là để khởi động lại máy chủ khi mỗi thay đổi mã). – prograils

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