运行 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>
最简单的方法如下:
将 example.rb
代码打包成 class 或模块,如下所示:
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 访问,因此如果您想显示结果,您可以从那里访问它。
这是一个潜在的问题,但是 - 当页面呈现时 url 仍然会显示 "your_host.com/p"
并且如果用户重新加载页面,他们将得到 404 / "route not found" 错误,因为没有定义 get "/p"
。
作为解决方法,您可以 redirect '/'
并按照 in this Whosebug answer or Sinatra' official FAQ 所述使用 session
来传递结果值。
我有一个 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>
最简单的方法如下:
将
example.rb
代码打包成 class 或模块,如下所示: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 访问,因此如果您想显示结果,您可以从那里访问它。
这是一个潜在的问题,但是 - 当页面呈现时 url 仍然会显示 "your_host.com/p"
并且如果用户重新加载页面,他们将得到 404 / "route not found" 错误,因为没有定义 get "/p"
。
作为解决方法,您可以 redirect '/'
并按照 in this Whosebug answer or Sinatra' official FAQ 所述使用 session
来传递结果值。