从html表单运行Ruby文件提交

时间:2017-11-11 17:08:25

标签: ruby html5 forms sinatra

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

基本上,我不确定如何使用用户从HTML form中选择的文件名运行此外部Ruby程序。

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

<!doctype html>
<html lang="en">
<head>
  <title><%= @title || "RSG" %></title>
  <meta charset="UTF8">
</head>
<body>
 <h1>RubyRSG Demo</h1>
 <p>Select grammar file to create randomly generated sentence</p>
 <form action="/p" method="post">
  <select name="grammar_file">
      <option value="Select" hidden>Select</option>
      <option value="Poem">Poem</option>
      <option value="Insult">Insult</option>
      <option value="Extension-request">Extension-request</option>
      <option value="Bond-movie">Bond-movie</option>
 </select>
 <br><br>
 </form>
<button type="submit">submit</button>
<section>
 <%= yield %>
</section>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

最简单的方法如下:

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

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

  3. post操作中,阅读参数并调用方法:

    post '/p' do
      @result = FileReader.read_grammar_defs(params[:grammar_file])
      erb :home
    end
    
  4. 使用此代码,在提交表单后,它将填充@result变量并呈现:home模板。可以从ERB访问实例变量,因此如果要显示结果,可以从那里访问它。

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

    作为一种变通方法,您可redirect '/'使用in this StackOverflow answerSinatra' official FAQ所述的session来传递结果值。