2012-03-08 32 views
6

Tôi đang cố gắng sử dụng kiểu phân lớp trong ứng dụng Sinatra. Vì vậy, tôi có một ứng dụng chính như thế này.Làm cách nào để cấu hình đúng cách trong ứng dụng mô đun Sinatra.?

class MyApp < Sinatra::Base 
    get '/' 
    end 

    ... 
end 

class AnotherRoute < MyApp 
    get '/another' 
    end 

    post '/another' 
    end 
end 
run Rack::URLMap.new \ 
    "/"  => MyApp.new, 
    "/another" => AnotherRoute.new 

Trong config.ru Tôi hiểu rằng nó chỉ cho "GET" như thế nào về các nguồn lực khác (ví dụ "PUT", "POST")? Tôi không chắc liệu tôi có bỏ lỡ điều hiển nhiên hay không. Và cũng có thể nếu tôi có mười đường dẫn (/ path1,/path2, ...) tôi có phải cấu hình tất cả trong config.ru mặc dù họ đang ở trong cùng một lớp học?

+0

Tại sao bạn muốn có lớp khác nhau cho mỗi con đường? Tại sao bạn không thể có tất cả ánh xạ URL trong MyApp? – ch4nd4n

+0

Tôi chỉ muốn làm cho nó dễ dàng hơn để tách biệt vì ứng dụng của tôi đang ngày càng lớn hơn và tôi không muốn cuộn lên xuống luôn luôn. – toy

+0

Bạn đã xem [padrino] (http://www.padrinorb.com/) chưa? Nó khá là một ** wrapper ** linh hoạt trên đầu trang của Sinatra. – ch4nd4n

Trả lời

4

Với URLMap bạn chỉ định url cơ sở nơi ứng dụng sẽ được gắn kết. Đường dẫn được chỉ định trong bản đồ không được sử dụng khi xác định tuyến đường nào sẽ sử dụng trong chính ứng dụng. Nói cách khác, ứng dụng hoạt động như thể gốc của nó là sau đường dẫn được sử dụng trong URLMap.

Ví dụ, mã của bạn sẽ phản ứng với các đường dẫn sau:

  • /: sẽ được chuyển đến các tuyến đường / trong MyApp

  • /another: sẽ đi đến con đường / trong AnotherRoute. Kể từ khi AnotherRoute kéo dài MyApp, số này sẽ giống như / trong MyApp (nhưng trong một trường hợp khác).

    URLMap xem /another và sử dụng nó để ánh xạ tới AnotherRoute, tước phần này của yêu cầu khỏi đường dẫn. AnotherRoute sau đó chỉ thấy /.

  • /another/another: sẽ được chuyển đến hai tuyến /another trong AnotherRoute. Một lần nữa, another đầu tiên được URLMap sử dụng để định tuyến yêu cầu đến AnotherRoute. AnotherRoute sau đó chỉ nhìn thấy đường dẫn thứ hai another.

    Lưu ý rằng đường dẫn này sẽ phản hồi cả hai yêu cầu GETPOST, mỗi yêu cầu được xử lý theo khối thích hợp.

Nó không rõ ràng những gì bạn đang cố gắng để làm, nhưng tôi nghĩ rằng bạn có thể đạt được những gì bạn muốn bằng cách chạy một thể hiện của AnotherRoute với config.ru mà chỉ là:

run AnotherRoute.new 

Kể từ AnotherRoute kéo dài MyApp, tuyến đường / sẽ được xác định cho nó.

Nếu bạn đang tìm cách thêm tuyến đường vào ứng dụng Sinatra hiện có, bạn có thể create a module with an included method that adds the routes, thay vì sử dụng thừa kế.

15

app.rb

class MyApp < Sinatra::Base 
    get '/' 
    end 
end 

app2.rb Nếu bạn muốn hai tập tin riêng biệt. Lưu ý điều này thừa kế từ Sinatra :: Base không phải MyApp.

class AnotherRoute < Sinatra::Base 
    get '/' 
    end 

    post '/' 
    end 
end 

Các config.ru

require 'bundler/setup' 
Bundler.require(:default) 

require File.dirname(__FILE__) + "/lib/app.rb" 
require File.dirname(__FILE__) + "/lib/app2.rb" 


map "/" do 
    run MyApp 
end 

map "/another" do 
    run AnotherRoute 
end 
Các vấn đề liên quan