Formulaire de contact en rubis, sinatra, et haml
Question
Je suis nouveau à tous les trois, et je suis en train d'écrire un simple formulaire de contact pour un site Web. Le code que je suis venu avec est en bas, mais je sais qu'il ya des problèmes fondamentaux avec elle (en raison de mon manque d'expérience avec sinatra). Toute aide à obtenir ce travail serait apprécié, je ne peux pas sembler figurer dehors / trouver la documentation pour ce genre de chose.
Code haml de la page de contact:
%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"}
Et voici mon code dans app.rb de 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
La solution
Je pensais que ce pour l'un de vous demander:
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"}
Et le 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
Autres conseils
Dans le cas où tout le monde peut l'utiliser, voici ce que vous pourriez avoir besoin d'utiliser votre compte gmail pour envoyer du courrier.
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
Notez la redirection à la fin, vous aurez besoin d'un success.haml pour indiquer à l'utilisateur que son courriel a été envoyé avec succès.
Hmm, je l'ai essayé dans iRB ce qui suit:
foo = #{23}
Bien sûr, il ne fonctionnera pas! le « # » est pour des commentaires dans Ruby il se produit dans SAUF SI une chaîne! Son même commentaire dans la mise en évidence de la syntaxe. Qu'est-ce que vous vouliez était:
name = "#{params[:name]}"
comme vous l'avez fait dans votre solution (qui est pas nécessaire, car il est déjà une chaîne).
BTW, la raison pour laquelle le code ne renvoie pas d'erreur est le suivant:
a =
b =
42
définit a et b à 42. Vous pouvez même faire des choses étranges (comme vous l'avez fait par hasard) et définissez les variables à la valeur de retour d'une fonction qui prend ces variables comme paramètres:
def foo(a,b)
puts "#{a.nil?} #{b.nil?}" #outputs 'true true'
return 42
end
a =
b =
foo(a,b)
fixera a et b à 42.
# {} est une interpolation qui est utilisé à l'intérieur "". Il suffit de l'utiliser à l'extérieur pour une affectation de variable ne fonctionnera pas.
Il serait plus susceptible d'être utilisé comme ceci:
number_of_people = 15
Puts "There are #{number_of_people} scheduled tonight"
J'ai créé un exemple en deux parties qui est disponible sur GitHub. L'application de formulaire d'inscription est ici: inscription-form-heroku et un exemple du site statique qui interagit avec c'est ici: statique site web à s3-exemple . L'application de formulaire est construit en utilisant Sinatra et est prêt à déployer directement sur Heroku. Le site statique est prêt à déployer directement à S3 et utiliser Amazon CloudFront.