2010-01-14 31 views
28

Soy nuevo en los tres, y estoy tratando de escribir un formulario de contacto simple para un sitio web. El código que se me ocurrió es el siguiente, pero sé que hay algunos problemas fundamentales con él (debido a mi inexperiencia con sinatra). Cualquier ayuda para hacer que esto funcione sería apreciada, parece que no puedo encontrar/encontrar la documentación para este tipo de cosas.Formulario de contacto en ruby, sinatra y haml

código haml desde la página de contacto:

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

Y aquí es mi código en 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 
+0

dónde está el 'GET' y qué error se puede conseguir? Además, ¿qué pasa con el mensaje [mail] de nombres? ¿Por qué no solo "correo"? –

Respuesta

44

lo he descubierto por cualquiera de usted que se pregunta:

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 la 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

¡gracias, justo lo que he estado buscando! – mmr

+1

Poco error en esta respuesta sobre el atributo 'para' en etiquetas: "Este atributo asocia explícitamente la etiqueta que se está definiendo con otro control. Cuando está presente, el valor de este atributo debe ser el mismo que el valor del atributo id de algunos otro control en el mismo documento. Cuando está ausente, la etiqueta que se está definiendo está asociada con el contenido del elemento ". - http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1 – abernier

3

Uhmm, i trató de IRB lo siguiente:

foo = #{23} 

Por supuesto no lo puedo trabajar! el '#' es para comentarios en Ruby ¡A MENOS que ocurra en una cadena! Incluso se comentó en el resaltado de sintaxis. Lo que quería era:

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

como lo hizo en su solución (que no es necesario, como ya es una cadena).

Por cierto, la razón por la que el código no emite un error es el siguiente:

a = 
b = 
42 

establecerá a y b a 42. Incluso se puede hacer algunas cosas extrañas (como lo hizo accidentalmente) y establecer las variables en el valor de retorno de una función que toma estas variables como parámetros:

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

fijará a y b a 42.

4

En caso de que alguien puede usar esto, esto es lo que migh Necesito usar su cuenta de Gmail para enviar correos.

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 

Nota la redirección al final, por lo que tendrá un success.haml para indicar al usuario que su correo electrónico ha sido enviada.

0

He creado un ejemplo de esto en dos partes que está disponible en github. La aplicación de formulario de registro está aquí: signup-form-heroku y un ejemplo del sitio web estático que interactúa con esto está aquí: static-website-to-s3-example. La aplicación de formularios está construida con Sinatra y está lista para desplegarse directamente en Heroku. El sitio estático está listo para implementarse directamente en S3 y utilizar Amazon cloudfront.

1

# {} es la interpolación que se usa dentro de "". Solo usarlo afuera para una asignación variable no funcionará.

Sería más probable que se utilicen de esta manera:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight" 
Cuestiones relacionadas