Formulário de contato em ruby, sinatra, e haml
Pergunta
Eu sou novo para todos três, e eu estou tentando escrever um simples formulário de contato para um site.O código de eu ter vindo até abaixo, mas eu sei que existem alguns problemas fundamentais com ele (devido à minha inexperiência com o sinatra).Qualquer ajuda em fazer este trabalho serão bem-vindos, não consigo descobrir/encontrar a documentação para esse tipo de coisa.
haml código da página de contato:
%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"}
E aqui está o meu código em sinatra app.rb:
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
Solução
Eu descobri para qualquer um de vocês se perguntando:
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 o 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
Outras dicas
Caso alguém possa usar isso, eis o que você pode precisar usar sua conta do Gmail para enviar e -mails.
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
Observe o redirecionamento no final, então você precisará de um sucesso.
Uhmm, eu tentei no irb as seguintes:
foo = #{23}
É claro que isso não vai funcionar!o '#' é para comentários em Ruby, a MENOS que ele ocorre em uma seqüência de caracteres!Até é comentada no realce de sintaxe.O que você queria era:
name = "#{params[:name]}"
como você fez na sua solução (o que não é necessário, como já é uma seqüência de caracteres).
Btw, a razão pela qual o código não lançar um erro é o seguinte:
a =
b =
42
vai conjunto a e b a 42.Você pode até mesmo fazer algumas coisas estranhas (como você acidentalmente fez) e definir as variáveis para o valor de retorno de uma função que leva essas variáveis como parâmetros:
def foo(a,b)
puts "#{a.nil?} #{b.nil?}" #outputs 'true true'
return 42
end
a =
b =
foo(a,b)
vai conjunto a e b a 42.
#{} é a interpolação usada dentro de "". Apenas usá -lo fora para uma atribuição variável não funcionará.
Seria mais provável de ser usado assim:
number_of_people = 15
Puts "There are #{number_of_people} scheduled tonight"
Eu criei um exemplo disso em duas partes disponíveis no Github. O aplicativo de formulário de inscrição está aqui: SignUP-Form-Heroku E um exemplo do site estático que interage com isso está aqui: estático-website-to-S3-exemplo. O aplicativo de formulário é construído usando Sinatra e está pronto para implantar diretamente no Heroku. O site estático está pronto para implantar diretamente para o S3 e usar o Amazon CloudFront.