我有一个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>
答案 0 :(得分:1)
最简单的方法如下:
将example.rb
代码打包到类或模块中,如下所示:
class FileReader
def self.read_grammar_defs(filename)
# ...
end
end
需要sinatra服务器上的文件
在post
操作中,阅读参数并调用方法:
post '/p' do
@result = FileReader.read_grammar_defs(params[:grammar_file])
erb :home
end
使用此代码,在提交表单后,它将填充@result
变量并呈现:home
模板。可以从ERB访问实例变量,因此如果要显示结果,可以从那里访问它。
这是一个潜在的问题,但是 - 当呈现页面时,网址仍会显示"your_host.com/p"
,如果用户重新加载页面,他们将获得404 /“找不到路由”错误,因为那里没有定义get "/p"
。
作为一种变通方法,您可redirect '/'
使用in this StackOverflow answer或Sinatra' official FAQ所述的session
来传递结果值。