2017-11-11 1 views
0

Ich habe ein Ruby-Programm, das eine Datei liest und eine bestimmte Ausgabe zurückgibt. Ich muss jetzt eine Web-App dieses Programms mit Sinatra erstellen. Ich habe eine form mit allen Dateioptionen erstellt und möchte nun den Ruby-Code mit der ausgewählten Datei aus dem Formular ausführen, nachdem die Schaltfläche zum Senden gedrückt wurde.Ruby-Datei von HTML-Formular ausführen senden

Grundsätzlich bin ich nicht sicher, wie dieses externe Ruby-Programm mit dem Dateinamen ausgeführt werden soll, der vom Benutzer aus dem HTML form ausgewählt wurde. Das Ruby-Programm (example.rb) beginnt mit der Definition 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> 

Antwort

1

Der einfachste Weg ist wie folgt:

  1. Paket den example.rb Code in einer Klasse oder eines Moduls, wie so:

    class FileReader 
        def self.read_grammar_defs(filename) 
        # ... 
        end 
    end 
    
  2. benötigen die Datei von Ihrem sinatra Server

  3. In der post Aktion lesen die params und rufen Sie die Methode:

    post '/p' do 
        @result = FileReader.read_grammar_defs(params[:grammar_file]) 
        erb :home 
    end 
    

Mit diesem Code, nach dem Absenden des Formulars, würde es die @result Variable und machen die :home Vorlage füllen. Auf Instanzvariablen kann von ERB aus zugegriffen werden, so dass Sie von dort aus darauf zugreifen können, wenn Sie das Ergebnis anzeigen möchten.

Dies ist ein mögliches Problem mit diesem, wenn auch - wenn die Seite der URL noch gerendert wird "your_host.com/p" sagen wird, und wenn der Benutzer die Seite neu geladen, werden sie eine 404/„Route nicht gefunden“ Fehlermeldung erhalten, weil es keine get "/p" definiert.

Als Abhilfe können Sie redirect '/' und verwenden session als in this StackOverflow answer oder Sinatra' official FAQ beschrieben den Ergebniswert zu übergeben.

+0

Ich habe <% = rsg (params [: grammar_file])%> in home.erb aber das Drucken auf der Konsole und nicht die Seite – msc

+0

setzen es in der Post-Methode wie RSG (params [: grammar_file]) auch druckt in der Konsole ... nicht sicher warum – msc

+0

alles? Ich bin seit Stunden festgefahren – msc

Verwandte Themen