如何将实例变量传递给Sinatra类

时间:2015-02-27 22:15:41

标签: ruby sinatra

我正在用一堆类编写一个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)。

1 个答案:

答案 0 :(得分:0)

您可以使用以下命令将参数传递给sinatra应用程序:

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

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

Sidenote 1 :代码行

@var1 = @var1

没有做任何事情。

Sidenote 2 :你不需要在你的sinatra课程中run!。它无论如何都会开始。

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

Sidenote 4 :看一下用于启动基于机架的应用程序的工具可能是值得的。 Unicorn是一个非常受欢迎的工具。谁知道 - 那里甚至可能有Thor-Unicorn整合。