从html表单提交运行Ruby文件

我有一个Ruby程序,它读取一个文件并返回一个特定的输出。 我现在必须使用Sinatra创建该程序的Web应用程序。 我创建了一个包含所有文件选项的form ,现在我想在按下提交按钮后从表单中运行该选定文件的Ruby代码。

基本上,我不确定如何让这个外部Ruby程序与用户从HTML form选择的文件名一起运行。

Ruby程序( example.rb )以定义def read_grammar_defs(filename)

 // sinatra_main.rb require 'sinatra' require 'sinatra/reloader' if development? #gem install sinatra-contrib require './rsg.rb' get '/' do erb :home end post '/p' do //call program to read file with the parameter from form end // layout.erb        

RubyRSG Demo

Select grammar file to create randomly generated sentence

Select Poem Insult Extension-request Bond-movie

最简单的方法如下:

  1. example.rb代码打包到类或模块中,如下所示:

     class FileReader def self.read_grammar_defs(filename) # ... end end 
  2. 需要来自sinatra服务器的文件

  3. post动作中,阅读params并调用方法:

     post '/p' do @result = FileReader.read_grammar_defs(params[:grammar_file]) erb :home end 

使用此代码,在提交表单后,它将填充@result变量并呈现:home模板。 可以从ERB访问实例变量,因此如果要显示结果,可以从中访问它。

这是一个潜在的问题,但是 – 当页面呈现时,url仍然会说"your_host.com/p" ,如果用户重新加载页面,他们将得到404 /“找不到路由”错误,因为有没有定义get "/p"

作为一种变通方法,您可以redirect '/'并使用此StackOverflow答案或Sinatra官方常见问题解答中描述的session来传递结果值。