2012-04-05 14 views
6

Tôi có một ứng dụng Sinatra rằng, luộc xuống, trông cơ bản như thế này:Làm thế nào để xác định một phương thức được gọi từ khối cấu hình của ứng dụng sinatra kiểu mô-đun?

class MyApp < Sinatra::Base 

    configure :production do 
    myConfigVar = read_config_file() 
    end 

    configure :development do 
    myConfigVar = read_config_file() 
    end 

    def read_config_file() 
    # interpret a config file 
    end 

end 

Thật không may, điều này không làm việc. Tôi nhận được undefined method read_config_file for MyApp:Class (NoMethodError)

Logic trong read_config_file là không tầm thường, vì vậy tôi không muốn sao chép cả hai. Làm thế nào tôi có thể xác định một phương thức có thể được gọi từ cả hai khối cấu hình của tôi? Hay tôi chỉ đang tiếp cận vấn đề này theo cách hoàn toàn sai lầm?

Trả lời

5

Dường như khối configure được thực hiện khi tệp được đọc. Bạn chỉ cần di chuyển định nghĩa phương thức của mình trước khối cấu hình và chuyển đổi nó thành phương thức lớp:

class MyApp < Sinatra::Base 

    def self.read_config_file() 
    # interpret a config file 
    end 

    configure :production do 
    myConfigVar = self.read_config_file() 
    end 

    configure :development do 
    myConfigVar = self.read_config_file() 
    end 

end 
+0

Rực rỡ! Điều đó hoạt động. Bây giờ tôi phải đọc một cuốn sách ruby ​​để tìm ra sự khác biệt địa ngục nằm giữa 'def methodname' và' def self.methodname', là cú pháp mới với tôi. – Seldo

0

Các khối cấu hình của bạn được chạy khi định nghĩa lớp được đánh giá. Vì vậy, bối cảnh là bản thân lớp, không phải là một cá thể. Vì vậy, bạn cần một phương thức lớp, không phải là một phương thức thể hiện.

def self.read_config_file 

Điều đó sẽ hiệu quả. Chưa thử nghiệm. ;)

+0

Tôi sợ sử dụng 'self.read_config_file' cho cùng một lỗi. Xin lỗi, tôi nên có quy định rằng tôi đã cố gắng này :-) – Seldo

+0

Chết tiệt, tôi đã ** rất gần **. Người trả lời thứ hai là đúng. Định nghĩa lớp được hiểu là tệp được đọc và tôi đoán các khối đó được thực thi ngay lập tức bởi Sinatra, vì vậy bạn cần xác định phương thức lớp trước khi bạn thiết lập các dòng cấu hình. –

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