【问题标题】:How to use params in a Sinatra controller如何在 Sinatra 控制器中使用参数
【发布时间】:2020-04-14 14:56:27
【问题描述】:

我正在尝试用 Rails 风格编写 Sinatra:

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

我无法在控制器中访问paramsrequestresponse

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

我可以通过作为参数从app.rb 传递来做到这一点,但我希望它表现得像 Rails。

【问题讨论】:

  • 您的app.rb 是否在定义SomeController 的文件上执行require
  • 是的app.rb 有一个require SomeControler 控制去控制器,但参数是nil 那里
  • 在 Rails 中 paramsActionController 中定义。您是否有一个 Rails 示例,您可以从控制器外部访问您的params
  • 没有未定义外部控制器参数,但在这种情况下,我的控制器也继承自 Sinatra::Base,就像 app.rb 中的 get 方法一样

标签: ruby sinatra


【解决方案1】:

我要做的是制作一个接受参数/请求/响应作为初始化参数的基本控制器:

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 个变量在当前上下文中都可用

【讨论】:

  • BaseController 必须继承自 Sinatra::Base
  • @ashwintastic 为什么?
  • 不确定如何从控制器渲染视图?
  • @ashwintastic 如果您将基本控制器更改为存储对sinatra_app 的引用,您可以调用render
  • 我是通过继承Sinatra::Base实现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多