2011-12-09 27 views
10

Có cách nào để ghi đè lên trang lỗi mặc định của Notatra không (Lỗi "Sinatra không biết ditty này")? Tôi muốn sinatra chỉ hiển thị một chuỗi đơn giản là "Phương thức không tìm thấy" khi nó không tìm thấy con đường thích hợp, nhưng khi tôi nâng lỗi 404 từ bên trong một tuyến đường, tôi muốn nó hiển thị thông báo lỗi được truyền vào.Ghi đè lên trang lỗi mặc định Không hợp lệ của Sinatra

Thực hiện khối not_found như thế này:

not_found do 
    'Method not found.' 
    end 

công trình, nhưng không phải là một lựa chọn hợp lệ của nó kể từ khi tôi muốn để có thể ném các thông báo lỗi notfound của riêng tôi từ các tuyến đường như thế này:

get '/' do 
    begin 
     # some processing that can raise an exception if resource not found 
    rescue => e 
     error 404, e.message.to_json 
    end 
    end 

Nhưng như khối not_found dự kiến ​​sẽ ghi đè thông báo lỗi của tôi.

Trả lời

0

Nevermind, phát hiện ra rằng tất cả các tuyến được kết hợp trong trật tự, vì vậy sau khi tất cả các tuyến đường tôi đặt get/post/put/delete '*' do ; end và giải quyết vấn đề của tôi.

5

Nếu bạn không sử dụng xử lý lỗi trong tuyến đường của bạn, bạn có thể sử dụng được xây dựng trong error tuyến đường như thế này (thực hiện và sửa đổi từ cuốn sách Sinatra: Up and Running)

require 'sinatra' 

configure do 
    set :show_exceptions, false 
end 

get '/div_by_zero' do 
    0/0 
    "You won't see me." 
end 

not_found do 
    request.path 
end 

error do 
    "Error is: " + params['captures'].first.inspect 
end 

Có một tham số captures chứa của bạn lỗi. Bạn có thể truy cập nó qua params['captures']. Nó là một mảng, và trong các thử nghiệm của tôi nó sẽ chứa một phần tử duy nhất, đó là lỗi chính nó (không phải là một chuỗi).

Here is information on the request object.

+0

Tôi hoạt động nhưng không phải cho các tuyến đường chưa từng có, vì vậy nếu tôi có ứng dụng sinatra giống như ứng dụng bạn đã đăng và cố gắng truy cập ví dụ: '/ this_is_not_a_present_route' Tôi vẫn thấy trang mặc định của sinatra thay vì thông báo lỗi. –

+1

Vì vậy, nếu bạn có yêu cầu cho một tuyến đường không tồn tại, sau đó sử dụng tuyến đường 'not_found'. Trong đối tượng yêu cầu, có 'request.path' sẽ cung cấp cho bạn' 'this_is_not_a_present_route'' trong ví dụ của bạn. Tôi cũng cập nhật ví dụ. –

+0

Xin chào, vấn đề là làm thế nào để không ghi đè lên các thông báo lỗi 404 khác được nêu ra từ các tuyến bên trong. Bằng cách đó, nó sẽ luôn hiển thị request.path nếu cố gắng tiếp cận một tuyến đường không được triển khai nhưng sẽ hiển thị nó nếu một số lỗi 404 được nâng lên từ các tuyến đường bên trong. –

13

Có lẽ một giải pháp duyên dáng hơn đề xuất trong the accepted answer chỉ để giải cứu Sinatra::NotFound, thay vì sử dụng kiểu error(404) hoặc not_found.

error Sinatra::NotFound do 
    content_type 'text/plain' 
    [404, 'Not Found'] 
end 

Điều này ngăn cản các "Sinatra không biết Ditty này" trang mặc định cho các tuyến đường mà bạn chưa xác định, nhưng không nhận được trong cách rõ ràng return [404, 'Something else'] phản ứng kiểu.

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