2010-01-14 5 views
28

Sono nuovo di tutti e tre e sto cercando di scrivere un semplice modulo di contatto per un sito web. Il codice che ho trovato è sotto, ma so che ci sono alcuni problemi fondamentali con esso (a causa della mia inesperienza con Sinatra). Sarebbe gradito qualsiasi aiuto per ottenere questo lavoro, non riesco a capire/trovare la documentazione per questo genere di cose.Modulo di contatto in ruby, sinatra e haml

codice Haml dalla pagina di contatto:

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

dov'è il 'GET' e quale errore si ottiene? Inoltre, che succede con il nome del messaggio [mail]? Perché non solo "mail"? –

risposta

44

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

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

grazie, proprio quello che stavo cercando! – mmr

+1

Piccolo errore in questa risposta sull'attributo 'for' nelle etichette: "Questo attributo associa esplicitamente l'etichetta definita con un altro controllo. Quando presente, il valore di questo attributo deve essere uguale al valore dell'attributo id di alcuni altro controllo nello stesso documento: quando assente, l'etichetta che viene definita è associata al contenuto dell'elemento. " - http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1 – abernier

3

Uhmm, ho provato a IRB seguente:

foo = #{23} 

Naturalmente non funzionerà! il '#' è per i commenti in Ruby A MENO CHE si verifichi in una stringa! È persino commentato nell'evidenziazione della sintassi. quello che si voleva era:

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

come avete fatto nella vostra soluzione (che non è necessario, come già è una stringa).

Btw, il motivo per cui il codice non genera un errore è il seguente:

a = 
b = 
42 

imposterà A e B a 42. Si può anche fare alcune cose strane (come avete fatto per sbaglio) e impostare le variabili al 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à un e b a 42.

4

Nel caso chiunque può utilizzare questo, ecco cosa migh t bisogno di usare il tuo account gmail per inviare posta.

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 

Annotare il reindirizzamento alla fine, quindi sarà necessario un success.haml per indicare all'utente che la loro email è stata inviata con successo.

0

Ho creato un esempio di questo in due parti che è disponibile su github. L'app del modulo di registrazione è qui: signup-form-heroku e un esempio del sito Web statico che interagisce con questo è qui: static-website-to-s3-example. L'app per moduli è costruita usando Sinatra ed è pronta per essere distribuita direttamente su Heroku. Il sito statico è pronto per la distribuzione direttamente su S3 e utilizza il cloudfront di Amazon.

1

# {} è l'interpolazione utilizzata all'interno di "". Il solo utilizzo esterno per un incarico variabile non funzionerà.

Sarebbe più suscettibili di essere utilizzati in questo modo:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight"