Как использовать params в контроллере Sinatra - PullRequest
3 голосов
/ 09 апреля 2020

Я пытаюсь написать Синатру в стиле Rails:

#in app.rb
 get '/' do 
   # params request and response are accessible here
   SomeController.new.some_method
 end

Я не могу получить доступ к params, request или response в контроллере:

  class SomeController < Sinatra::Base
    def some_method
      #params are nil here
   end
  end

Я могу сделать это, передав в качестве аргумента app.rb, но я хочу, чтобы он вел себя как Rails.

1 Ответ

2 голосов
/ 10 апреля 2020

Я бы сделал базовый контроллер, который принимает параметры / запрос / ответ в качестве параметров инициализации:

require 'sinatra'
require 'byebug'

class BaseController
  attr_reader :params, :request, :response
  def initialize(sinatra_app)
    @params   = sinatra_app.params
    @request  = sinatra_app.request
    @response = sinatra_app.response
  end
end

class SomeController < BaseController
  def some_method
    {
      params:   params.class.name,
      request:  request.class.name,
      response: response.class.name,
    }.to_json
  end
end

get '/' do
  SomeController.new(self).some_method
end

Затем тестирование:

$ curl localhost:4567

Ответ:

{
  "params":"Sinatra::IndifferentHash",
  "request":"Sinatra::Request",
  "response":"Sinatra::Response"
}

Показывает, что все 3 переменные доступны из текущего контекста

...