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