2010-01-14 11 views
28

Jestem nowy we wszystkich trzech i staram się napisać prosty formularz kontaktowy na stronie internetowej. Kod, który wymyśliłem, znajduje się poniżej, ale wiem, że są z nim pewne zasadnicze problemy (z powodu mojego braku doświadczenia z sinatrą). Jakakolwiek pomoc w uzyskaniu tej pracy byłaby doceniona, nie mogę wydawać się znaleźć/znaleźć dokumentację dla tego rodzaju rzeczy.Formularz kontaktowy w ruby, sinatrze i haml

haml kod ze strony kontaktowej:

%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"} 

I tu jest mój kod w app.rb Sinatry:

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 
+0

Gdzie jest 'GET' i jakie błędy otrzymasz? Co nowego w nazwie wiadomości [mail]? Dlaczego nie po prostu "poczta"? –

Odpowiedz

44

I zorientowaliśmy się dla każdego z was zastanawiasz:

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"} 

An D 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 
+0

dzięki, właśnie tego szukałem! – mmr

+1

Mały błąd w tej odpowiedzi na temat atrybutu "dla" w etykietach: "Ten atrybut wyraźnie wiąże etykietę zdefiniowaną z inną formantem. Gdy występuje, wartość tego atrybutu musi być taka sama jak wartość atrybutu id niektórych inna kontrola w tym samym dokumencie. Gdy jest nieobecny, definiowana etykieta jest powiązana z zawartością elementu. " - http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1 – abernier

3

Uhmm, próbowałem w IRB następujące:

foo = #{23} 

Oczywiście, że nie będzie działać! "#" jest dla komentarzy w Ruby, O ile nie występuje w ciągu znaków! Jest nawet komentowany w podświetlaniu składni. Co chciałeś było:

name = "#{params[:name]}" 

jak to było w roztworze (co nie jest konieczne, ponieważ już jest ciągiem).

Btw, dlatego kod nie rzucać się błąd jest następujący:

a = 
b = 
42 

ustawi A i B do 42. Można nawet robić jakieś dziwne rzeczy (jak przypadkowo zrobił) i ustawić zmienne do wartości zwracanej przez funkcję, która przyjmuje te zmienne jako parametry:

def foo(a,b) 
    puts "#{a.nil?} #{b.nil?}" #outputs 'true true' 
    return 42 
end 
a = 
b = 
foo(a,b) 

ustawi i B do 42.

4

na wypadek gdyby ktoś może korzystać z tego, co tu jest migh t musisz używać konta Gmail do wysyłania poczty.

post '/contact' do 
require 'pony' 
Pony.mail(
    :name => params[:name], 
    :mail => params[:mail], 
    :body => params[:body], 
    :to => '[email protected]', 
    :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    => '[email protected]', 
    :authentication  => :plain, 
    :domain    => 'localhost.localdomain' 
    }) 
redirect '/success' 
end 

Uwaga przekierowanie na końcu, więc trzeba będzie success.haml do wskazania użytkownikowi, że ich e-mail został wysłany pomyślnie.

0

Stworzyłem przykład tego w dwóch częściach, które są dostępne na github. Aplikacja formularza rejestracyjnego znajduje się pod adresem: signup-form-heroku, a przykład statycznej witryny internetowej, która wchodzi w interakcję, znajduje się tutaj: static-website-to-s3-example. Aplikacja do tworzenia formularzy została zbudowana za pomocą aplikacji Sinatra i jest gotowa do wdrożenia bezpośrednio na Heroku. Strona statyczna jest gotowa do wdrożenia prosto do S3 i korzystania z chmurki amazon.

1

# {} jest interpolacją, która jest używana wewnątrz "". Używanie go na zewnątrz do przypisania zmiennych nie będzie działać.

byłoby bardziej prawdopodobne, aby być używane tak:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight"