web-dev-qa-db-fra.com

Formulaire de contact en rubis, sinatra et haml

Je suis nouveau pour les trois et j'essaye d'écrire un simple formulaire de contact pour un site web. Le code que j'ai proposé est ci-dessous, mais je sais qu'il pose certains problèmes fondamentaux (en raison de mon manque d'expérience avec Sinatra). Toute aide pour que cela fonctionne serait appréciée, je n'arrive pas à comprendre/trouver la documentation pour ce genre de chose.

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

Je l'ai compris pour tous ceux qui se demandaient:

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

Et 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
44
dcb

Si cela peut être utilisé par tout le monde, voici ce dont vous pourriez avoir besoin pour utiliser votre compte Gmail pour envoyer un courrier.

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

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

4
Mark Locklear

Uhmm, j'ai essayé dans irb ce qui suit:

foo = #{23}

Bien sûr ça ne marchera pas! le '#' est pour les commentaires dans Ruby SAUF s'il se produit dans une chaîne! Cela a même été commenté dans la coloration syntaxique… .. Ce que vous vouliez était:

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

comme vous l'avez fait dans votre solution (ce qui n'est pas nécessaire, car il s'agit déjà d'une chaîne).

Btw, la raison pour laquelle le code ne génère pas d'erreur est la suivante:

a =
b =
42

définira a et b sur 42. Vous pouvez même faire des choses étranges (comme vous l'avez fait accidentellement) et définir les variables sur la valeur de retour d'une fonction qui prend ces variables en tant que paramètres:

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

définira a et b sur 42.

3
stenno

# {} est l'interpolation utilisée dans "". Le fait de l'utiliser à l'extérieur pour une affectation 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" 
1
Russell Brown

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

0
Jason Robert Green