运行 Ruby 文件来自 html 表单提交

Run Ruby file from html form submit

我有一个 Ruby 程序可以读取一个文件并 returns 一个特定的输出。我现在必须使用 Sinatra 创建该程序的 Web 应用程序。我创建了一个包含所有文件选项的 form,现在我想 运行 按下提交按钮后,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

<!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. example.rb 代码打包成 class 或模块,如下所示:

    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
    

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

这是一个潜在的问题,但是 - 当页面呈现时 url 仍然会显示 "your_host.com/p" 并且如果用户重新加载页面,他们将得到 404 / "route not found" 错误,因为没有定义 get "/p"

作为解决方法,您可以 redirect '/' 并按照 in this Whosebug answer or Sinatra' official FAQ 所述使用 session 来传递结果值。