Modulo di contatto in Ruby, Sinatra e Haml
Domanda
Sono nuovo a tutti e tre e sto cercando di scrivere un semplice modulo di contatto per un sito web.Il codice che ho creato è riportato di seguito, ma so che ci sono alcuni problemi fondamentali (a causa della mia inesperienza con Sinatra).Qualsiasi aiuto per far funzionare tutto questo sarebbe apprezzato, non riesco a capire/trovare la documentazione per questo genere di cose.
codice haml dalla pagina dei contatti:
%form{:name => "email", :id => "email", :action => "/contact", :method => "post", :enctype => "text/plain"}
%fieldset
%ol
%li
%label{:for => "message[name]"} Name:
%input{:type => "text", :name => "message[name]", :class => "text"}
%li
%label{:for => "message[mail]"} Mail:
%input{:type => "text", :name => "message[mail]", :class => "text"}
%li
%label{:for => "message[body]"} Message:
%textarea{:name => "message[body]"}
%input{:type => "submit", :value => "Send", :class => "button"}
Ed ecco il mio codice nell'app.rb di Sinatra:
require 'rubygems'
require 'sinatra'
require 'haml'
require 'pony'
get '/' do
haml :index
end
get '/contact' do
haml :contact
end
post '/contact' do
name = #{params[:name]}
mail = #{params[:mail]}
body = #{params[:body]}
Pony.mail(:to => '*emailaddress*', :from => mail, :subject => 'art inquiry from' + name, :body => body)
end
Soluzione
ho capito per qualcuno di voi chiedendo:
Haml:
%form{ :action => "", :method => "post"}
%fieldset
%ol
%li
%label{:for => "name"} Name:
%input{:type => "text", :name => "name", :class => "text"}
%li
%label{:for => "mail"} email:
%input{:type => "text", :name => "mail", :class => "text"}
%li
%label{:for => "body"} Message:
%textarea{:name => "body"}
%input{:type => "submit", :value => "Send", :class => "button"}
E l'app.rb:
post '/contact' do
name = params[:name]
mail = params[:mail]
body = params[:body]
Pony.mail(:to => '*emailaddress*', :from => "#{mail}", :subject => "art inquiry from #{name}", :body => "#{body}")
haml :contact
end
Altri suggerimenti
Nel caso qualcuno possa usarlo, ecco cosa potresti aver bisogno per utilizzare il tuo account Gmail per inviare posta.
post '/contact' do
require 'pony'
Pony.mail(
:name => params[:name],
:mail => params[:mail],
:body => params[:body],
:to => 'a_lumbee@gmail.com',
:subject => params[:name] + " has contacted you",
:body => params[:message],
:port => '587',
:via => :smtp,
:via_options => {
:address => 'smtp.gmail.com',
:port => '587',
:enable_starttls_auto => true,
:user_name => 'lumbee',
:password => 'p@55w0rd',
:authentication => :plain,
:domain => 'localhost.localdomain'
})
redirect '/success'
end
Nota il reindirizzamento alla fine, quindi avrai bisogno di un success.haml per indicare all'utente che la sua email è stata inviata con successo.
Uhmm, ho provato a IRB il seguente:
foo = #{23}
Ovviamente non funzionerà! il '#' è per i commenti in Ruby MENO si verifica in una stringa! La sua anche commentato nella evidenziazione della sintassi. Quello che si voleva era:
name = "#{params[:name]}"
come avete fatto nella soluzione (che non è necessario, come lo è già una stringa).
A proposito, il motivo per cui il codice non genera un errore è il seguente:
a =
b =
42
fisserà a e b a 42. Si può anche fare alcune cose strane (come avete fatto per sbaglio) e impostare le variabili per il valore di ritorno di una funzione che prende queste variabili come parametri:
def foo(a,b)
puts "#{a.nil?} #{b.nil?}" #outputs 'true true'
return 42
end
a =
b =
foo(a,b)
fisserà A e B 42.
# {} è l'interpolazione che viene utilizzato all'interno di "". Usando solo fuori per un assegnamento di variabile non funzionerà.
Sarebbe più suscettibili di essere utilizzati in questo modo:
number_of_people = 15
Puts "There are #{number_of_people} scheduled tonight"
ho creato un esempio di questo in due parti che è disponibile su GitHub. Il modulo di iscrizione app è qui: iscrizione-form-Heroku e un esempio di sito web statico che interagisce con questo è qui: statico-sito-to-s3-esempio . La forma di app è costruito utilizzando Sinatra ed è pronto a distribuire direttamente sul Heroku. Il sito statico è pronto a distribuire direttamente a S3 e utilizzare CloudFront amazon.