2017-11-11 66 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