2010-01-14 7 views
28

Je suis nouveau à tous les trois, et j'essaye d'écrire un simple formulaire de contact pour un site web. Le code que j'ai trouvé est ci-dessous, mais je sais qu'il y a quelques problèmes fondamentaux (en raison de mon inexpérience avec sinatra). Toute aide pour obtenir ce travail serait appréciée, je n'arrive pas à trouver/trouver la documentation pour ce genre de chose.Formulaire de contact ruby, sinatra et haml

code haml de la page de contact:

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

Et voici mon code dans 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

Où est la 'get' et quelle erreur que vous obtenez? En outre, que se passe-t-il avec le message [mail] nommant? Pourquoi ne pas simplement "mail"? –

Répondre

44

j'ai tout compris pour l'un de vous demander:

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

merci, juste ce que je cherchais! – mmr

+1

Petite erreur dans cette réponse à propos de l'attribut 'for' dans les libellés: "Cet attribut associe explicitement le libellé en cours de définition à un autre contrôle Lorsqu'il est présent, la valeur de cet attribut doit être la même que la valeur de l'attribut id de certains autre contrôle dans le même document En l'absence, l'étiquette en cours de définition est associée au contenu de l'élément. " - http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1 – abernier

3

Hmm, j'ai essayé en iRB les éléments suivants:

foo = #{23} 

Bien sûr, il ne fonctionnera pas! le '#' est pour les commentaires dans Ruby à moins qu'il ne se produise dans une chaîne! Il a même commenté dans la coloration syntaxique. Qu'est-ce que vous vouliez était:

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

que vous avez fait dans votre solution (qui est pas nécessaire, car il est déjà une chaîne).

BTW, la raison pour laquelle le code ne renvoie pas d'erreur est le suivant:

a = 
b = 
42 

sera mis a et b à 42. Vous pouvez même faire des choses étranges (comme vous l'avez fait par hasard) et mis en les variables à la valeur de retour d'une fonction qui prend ces variables comme paramètres:

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

fixeront a et b à 42.

4

au cas où quelqu'un peut l'utiliser, voici ce que vous MIGH t besoin d'utiliser votre compte Gmail pour envoyer des mails.

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 

Notez la redirection à la fin, vous aurez besoin d'un success.haml pour indiquer à l'utilisateur que son courriel a été envoyé avec succès.

0

J'ai créé un exemple de ceci en deux parties qui est disponible sur github. L'application de formulaire d'inscription est ici: signup-form-heroku et un exemple de site Web statique qui interagit avec ceci est ici: static-website-to-s3-example. L'application de formulaire est construite en utilisant Sinatra et est prête à être déployée directement sur Heroku. Le site statique est prêt à être déployé directement sur S3 et à utiliser amazon cloudfront.

1

# {} est l'interpolation utilisée à l'intérieur de "". Le simple fait de l'utiliser à l'extérieur pour une assignation de variable ne fonctionnera pas.

Il serait plus susceptible d'être utilisé comme ceci:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight"