2012-03-19 30 views
5

Với tuyến đường Sinatra, làm thế nào có thể có cả thông số được yêu cầu có tên và tham số có tên tùy chọn trong cùng một phần của tuyến đường.Tham số bắt buộc và tùy chọn cho tuyến Sinatra

tham số tuyến đường bắt buộc hoạt động tốt ở đây

get '/widgets.?:format?' 

Nhưng, hãy thử kết hợp một tên paramter yêu cầu, và những thứ phá vỡ.

get '/widgets/:id.?:format?' 

Yêu cầu /widgets/abc.json chuyển toàn bộ abc.json làm thông số id.

Các Sinatra biên soạn regex là: ""

/^\/widgets\/([^\/?#]+)(?:\.|%2E)?([^\/?#]+)?$/ 
+1

Điều này là do regexp cho khớp ': id' là tham lam, nhưng thêm'? 'Vào phần còn lại làm cho chúng không phù hợp. Vui lòng mở [vấn đề] (https://github.com/sinatra/sinatra/issues/new), tôi có thể sửa lỗi này. –

Trả lời

2

tôi đã vượt qua điều này bằng cách đầy đủ regex trên tuyến đường và trừ từ nhóm regex đầu tiên.

get %r{/widgets\/([^\/?#\.]+)(?:\.|%2E)?([^\/?#]+)?} 
+0

Bạn cũng đã mở một vấn đề với yêu cầu @Konstantin chưa? Tôi đã gặp phải vấn đề này trước đây (mặc dù không thực sự ở Sinatra) và nó sẽ là tốt để biết nó đã được sửa trong Sinatra. – iconoclast

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