Tôi đã gặp sự cố với các trường hợp thiếu và lỗi nilClass khi gọi các tuyến đường của mình. Sau khi delving xung quanh bên trong nguồn nó có vẻ như các cuộc gọi generate_method về cơ bản tạo ra một phương pháp mới bằng cách sử dụng khối của phương pháp ban đầu.Làm việc xung quanh việc thiếu bối cảnh trong các phương pháp tuyến đường của Sinatra
get "/" do
@some_local_instance.do_something()
end
Vì vậy, trong các phương pháp trên có rất tốt có thể là một biến địa phương trong đó lớp được gọi là some_local_instance, tuy nhiên khi vẹt được đánh giá thực tế nó không có bối cảnh như đến nơi phương pháp đã được xác định, vì vậy nó sẽ thất bại.
Lý do tôi hỏi là bởi vì như một phần của kịch bản, tôi có các lớp bên ngoài được nạp khi Sinatra được nạp để đăng ký tuyến và khi các tuyến đó được gọi là tôi cần truy cập một số biến cục bộ trên các lớp này. Một ví dụ sẽ là:
class SomeRouteClass
def initialize(sinatra, calculator)
@calculator = calculator
@sinatra = sinatra
end
def setup_routes
@sinatra.get "/add" do
return @calculator.add(1,1)
end
end
end
class Calculator
def add(a,b)
return a+b;
end
end
sinatra = Sinatra.new
calculator = Calculator.new
routing_class = SomeRouteClass.new(sinatra, calculator)
routing_class.setup_routes
sinatra.run!
Hãy tha thứ cho bất kỳ lỗi chính tả/cú pháp này chỉ là một ví dụ nhanh, nhưng như bạn có thể thấy một lớp đăng ký tuyến đường và khi tuyến đường được đánh trả về một số giá trị được tạo ra bởi một thể hiện của máy tính nó đã diễn ra khi nó được khởi tạo.
Vấn đề tôi có là trong ví dụ này khi tôi thử và chạy/thêm tuyến đường, nó cho tôi biết rằng @calculator là một nilClass, và tôi tin rằng nó nằm xuống theo cách Sinatra chỉ lấy khối mã mà không bối cảnh. Điều này có vẻ tốt cho bất kỳ khuôn mẫu đơn giản, nhưng nếu bạn cần phải làm bất cứ điều gì ưa thích hơn, hoặc muốn giữ mã mô-đun của bạn bằng cách không sử dụng ... Điện thoại
giả định của tôi đúng ở đây? và nếu như vậy có cách nào để giữ bối cảnh vì nó cảm thấy như nó buộc tôi phải viết xấu và khó duy trì mã nếu tôi phải viết mọi thứ dưới dạng thống kê và người độc thân để tương tác từ một lộ trình.
== Sửa ==
đã cơ cấu lại các câu hỏi và nội dung để phản ánh chính xác hơn các vấn đề thực tế, bây giờ mà tôi có một sự hiểu biết vững chắc hơn của thư viện.
Sau khi xem xét một số nguồn khác, có vẻ như nó chỉ sao chép và dán phương pháp được sử dụng với một tuyến đường vào một phương pháp mới bằng cách sử dụng define_method. Cho nên không có ngữ cảnh nào ngoài phương pháp đó ... ngụ ý rằng cách duy nhất xung quanh đó là làm mọi thứ tĩnh, mà dường như sai ... vì khó thay đổi và thử nghiệm theo cách này ... tôi có thể hoàn toàn sai về những gì nó làm mặc dù Ruby vẫn là một ngôn ngữ mới với tôi. – Grofit
Đã cố gắng sử dụng mẫu đối tượng const để giải quyết vấn đề này, nhưng điều này vẫn khiến mọi thứ trở nên khó chịu vì mọi thứ phải tĩnh để làm việc này ... có lý do tại sao họ sao chép thân phương thức vào một phương thức mới vì vậy nó mất tất cả bối cảnh? vì tôi không thể thấy bất kỳ lợi ích nào cho nó, chỉ là nhược điểm ... mặc dù một lần nữa tôi mới làm quen với điều này vì vậy có thể không hoàn toàn hiểu được một số biến chứng đòi hỏi điều này. Chỉ có điều tôi có thể nghĩ là đối tượng cơ thể phương pháp có thể được làm sạch hoặc phương pháp có thể được cập nhật hoặc lấy đi từ cá thể trước khi nó được gọi, tuy nhiên dường như không có khả năng là – Grofit