【问题标题】:Run Ruby file from html form submit从 html 表单提交运行 Ruby 文件
【发布时间】:2018-04-24 17:36:52
【问题描述】:

我有一个读取文件并返回特定输出的 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

<!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>

【问题讨论】:

    标签: ruby html forms sinatra


    【解决方案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
      

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

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

    作为一种解决方法,您可以按照in this StackOverflow answerSinatra' official FAQ 的描述使用redirect '/'session 来传递结果值。

    【讨论】:

    • 我在 home.erb 中有 但它打印到控制台而不是页面
    • 把它放在像 rsg(params[:grammar_file]) 这样的 post 方法中也会打印在控制台中......不知道为什么
    • 什么?我被困了几个小时
    • 呃 .. rsg 方法实际上是做什么的?它是返回一个字符串还是只打印它? (提示:puts 返回零)
    • 它读取一个文件并从文件中的语法生成一个随机句子
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 2012-03-14
    • 1970-01-01
    • 2014-02-01
    • 2011-08-20
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多