【问题标题】:How to pass instance variables into a Sinatra class如何将实例变量传递给 Sinatra 类
【发布时间】:2015-03-02 00:38:26
【问题描述】:

我正在编写一个包含一堆类的 gem,其中一个是 Sinatra 类。在一个类中,我解析一个 SQL 文件以创建一个数组,其中包含一组分配给实例变量的值。我想获取这个实例变量并将其传递给我的 Sinatra 类,以便我可以打开浏览器并显示此信息。但是,我无法弄清楚如何做到这一点。到目前为止,我有这样的事情:

my_class.rb

class MyClass

  def get_columns
    # ...a bunch of code that parses, and ends up with an instance variable
    @var1 = ['column1','column2']
  end

  def start_sinatra
    %x(ruby sinatra_class.rb)
  end

end

sinatra_class.rb

require 'sinatra/base'
require 'launchy'

class SinatraClass < Sinatra::Base

  def open_browser
    Launchy.open('http://localhost:4567')
  end

  get '/' do
    @var1 = @var1
    erb :index
  end

  post '/' do
    erb :submit
  end

  run! if __FILE__ == $0

end

显然我知道这是不正确的。我想弄清楚的是如何从@var1 中获取从 MyClass 到 SinatraClass 的值,以便它们可以在我的索引 ERB 文件中使用。另外,我知道我的 hacky %x 命令不是从 MyClass 启动 Sinatra 的正确方法,但我想不出任何其他方法。这不起作用:

def start_sinatra
  start = SinatraClass.new
  start.run!
end

因为run! 不起作用,除非您从文件本身调用它(例如my_sinatra.rb)。

【问题讨论】:

  • 不知道您要做什么,但是要将值传递给您正在运行的命令,使它们成为命令行参数,然后在您正在运行的文件中读取它们。跨度>
  • 我该怎么做?能给我举个例子?问题是我不是从命令行启动 Sinatra。我正在使用 Thor,它开始实例化 MyClass 的一个实例。 MyClass 然后解析一堆数据,这些数据进入一个实例变量数组。然后我需要我的 MyClass 实例来启动 Sinatra,将该实例变量传递给它,并显示我在 MyClass 中解析的数据。我只是觉得必须有一种更简单的方法来做到这一点。

标签: ruby sinatra


【解决方案1】:

您可以通过以下方式将参数传递给您的 sinatra 应用程序:

def start_sinatra
  %x(ruby sinatra_class.rb "#{@var1.join ' '}")
end

然后在名为 ARGV 的内置数组中提取它们,因此当您想使用 @var1[0] 时,请改用 ARGV[0]

旁注1:代码行

@var1 = @var1

什么都没做。

旁注 2:你不需要在你的 sinatra 类中run!。无论如何都会开始的。

旁注 3:我不明白您要做什么,因此可能有更好的方法。例如 - 在命令行上调用 sinatra 可能是件好事。或不。你正在从你的另一个 Thor ruby​​ 类中生成一个新进程,它会等到它完成 - 也许这就是你想要的?启动浏览器的部分可能会建议您在继续之前等待一些用户交互?

旁注 4:可能值得看一下用于启动基于机架的应用程序的工具。 Unicorn 是一个非常受欢迎的工具。谁知道呢 - 甚至可能会有 Thor-Unicorn 集成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2021-05-09
    • 2020-07-05
    • 2014-07-12
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多