2017-11-11 65 views
0

我有一个Ruby程序读取文件并返回特定的输出。我必须现在使用Sinatra创建此程序的Web应用程序。我创建了一个包含所有文件选项的form,并且现在我想要在按下提交按钮后从表单中选择该文件来运行该Ruby代码。从HTML表单运行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> 

回答

1

最简单的方法如下:

  1. 包的example.rb代码到一个类或模块,像这样:

    class FileReader 
        def self.read_grammar_defs(filename) 
        # ... 
        end 
    end 
    
  2. 从西纳特拉服务器所需要的文件

  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 '/'并使用session如上所述in this StackOverflow answerSinatra' official FAQ传递的结果值。

+0

我在home.erb中有<%= rsg(params [:grammar_file])%>,但是它打印到控制台而不是页面 – msc

+0

将它放在post方法中,如rsg(params [:grammar_file])也打印在控制台...不知道为什么 – msc

+0

什么?我被卡住了几小时 – msc