2012-03-11 11 views
19

Câu hỏi đơn giản: Tôi muốn có thể chuyển các tùy chọn vào ứng dụng sinatra của tôi trong config.ru. Làm thế nào là có thể? config.ru của tôi trông như thế này:Gửi đối số cho ứng dụng sinatra mới

run MyApp 

Nhưng tôi muốn có điều này trong lớp MyApp của tôi để lấy đối số:

class MyApp < Sinatra::Base 
    def initialize(config) 
    @config = config 
    end 
end 

Nhưng tôi không thể tìm ra một cách để làm điều này. Ý tưởng?

Trả lời

23
  1. Sử dụng set/settings

    require 'sinatra/base' 
    
    class MyApp < Sinatra::Base 
        get '/' do 
        settings.time_at_startup.to_s 
        end 
    end 
    
    # Just arbitrarily picking time as it'll be static but, diff for each run. 
    MyApp.set :time_at_startup, Time.now 
    
    run MyApp 
    
  2. Sử dụng một tập tin cấu hình. Xem Sinatra::ConfigFile trong contrib (mà cũng sử dụng bộ và cài đặt, nhưng tải params từ một file YAML)

+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – Ronze

+2

Vì vậy, tôi không thể có một số phiên bản của một ứng dụng được định cấu hình theo các cách khác nhau? – andreypopp

5

Nếu bạn muốn cấu hình với params, tôi đã tìm ra rằng bạn có thể làm điều này:

require 'sinatra/base' 

class AwesomeApp < Sinatra::Base 
    def initialize(app = nil, params = {}) 
    super(app) 
    @bootstrap = params.fetch(:bootstrap, false) 
    end 
end 
+0

Trong config.ru bạn sẽ sử dụng 'run AwesomeApp.new (app, bootstrap: true)'. Lý do bạn có thể vượt qua lớp của bạn hoặc một thể hiện của lớp của bạn là 'Sinatra :: Base' đi kèm với một phương thức lớp' call' với các cuộc gọi cơ bản 'new.call (env)'. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1485 – phylae

1

rnicholson's response sẽ là câu trả lời tốt nhất trong hầu hết các trường hợp, nhưng nếu những gì bạn muốn là phải có quyền truy cập vào một biến Ví dụ trong tuyến đường của bạn, bạn có thể thiết lập các ký sử dụng các bộ lọc before như được giải thích trong Sinatra README:

Trước khi các bộ lọc được đánh giá trước mỗi yêu cầu trong cùng một ngữ cảnh như các tuyến đường sẽ có và có thể sửa đổi yêu cầu và phản hồi. Các biến thể hiện được đặt trong bộ lọc có thể truy cập được bằng các tuyến đường và mẫu:

before do 
    @note = 'Hi!' 
    request.path_info = '/foo/bar/baz' 
end 

get '/foo/*' do 
    @note #=> 'Hi!' 
    params['splat'] #=> 'bar/baz' 
end