ruby sinatra haml pony

ruby - Formulario de contacto en rubí, sinatra y haml.



pony (5)

Soy nuevo en los tres, y estoy tratando de escribir un formulario de contacto simple para un sitio web. El código que he encontrado está abajo, pero sé que hay algunos problemas fundamentales con él (debido a mi inexperiencia con sinatra). Cualquier ayuda para conseguir este trabajo sería apreciada, parece que no puedo encontrar / encontrar la documentación para este tipo de cosas.

código haml de 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í está 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


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

Sería más probable que se use así:

number_of_people = 15 Puts "There are #{number_of_people} scheduled tonight"


En caso de que alguien pueda usar esto, esto es lo que podría necesitar para usar su cuenta de gmail para enviar correo.

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 => ''p@55w0rd'', :authentication => :plain, :domain => ''localhost.localdomain'' }) redirect ''/success'' end

Tenga en cuenta la redirección al final, por lo que necesitará un success.haml para indicar al usuario que su correo electrónico se envió correctamente.


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 formulario está construida con Sinatra y está lista para implementarse directamente en Heroku. El sitio estático está listo para implementarse directamente en S3 y usar Amazon Cloudfront.


Lo resolví para cualquiera de ustedes preguntándose:

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

Y 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


Uhmm, probé en irb lo siguiente:

foo = #{23}

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

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

como hiciste en tu solución (que no es necesario, ya que ya es una cadena).

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

a = b = 42

establecerá a y b en 42. Incluso puede hacer algunas cosas extrañas (como lo hizo accidentalmente) y establecer las variables al 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.