Formulario de contacto en ruby, sinatra y haml


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ó está a continuación, pero sé que hay algunos problemas fundamentales con él (debido a mi inexperiencia con sinatra). Cualquier ayuda en conseguir que esto funcione sería apreciada, parece que no puedo averiguar / 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 la aplicación de sinatra.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
Author: dcb, 2010-01-15

5 answers

Me lo imaginé 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 aplicación.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
 44
Author: dcb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 18:56:49

En caso de que alguien pueda usar esto, esto es lo que puede 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 éxito.haml para indicar al usuario que su correo electrónico se ha enviado correctamente.

 4
Author: Lumbee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 00:45:49

Uhmm, probé en irb lo siguiente:

foo = #{23}

Por supuesto que no funcionan! el ' # ' es para comentarios en Ruby A MENOS que ocurra en una cadena! Su incluso comentado en el resaltado de sintaxis. Lo que querías era:

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

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

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

a =
b =
42

Pondrá a a y b a 42. Usted puede incluso hacer algunas cosas extrañas (como usted accidentalmente did) 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)

Pondrá a a y b a 42.

 3
Author: stenno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-13 09:49:21

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

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

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight" 
 1
Author: Russell Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-12 00:41:28

He creado un ejemplo de esto en dos partes que está disponible en github. La aplicación del formulario de suscripción 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 form está construida usando Sinatra y está lista para implementarse directamente en Heroku. El sitio estático está listo para implementarse directamente en S3 y usar amazon cloudfront.

 0
Author: Jason Robert Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-01 08:00:15