27 votes

Formulaire de contact en ruby, sinatra, et haml

Je suis nouveau dans ces trois domaines et j'essaie 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 avec lui (en raison de mon inexpérience avec Sinatra). Toute aide pour le faire fonctionner serait appréciée, je n'arrive pas à comprendre/trouver la documentation pour ce genre de choses.

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

42voto

dcb Points 625

J'ai trouvé la solution pour ceux qui se posent la question :

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

4voto

Lumbee Points 1216

Au cas où tout le monde pourrait l'utiliser, voici ce dont vous pourriez avoir besoin pour utiliser votre compte gmail pour envoyer du courrier.

post '/contact' do 
require 'pony'
Pony.mail(
   :name => params[:name],
  :mail => params[:mail],
  :body => params[:body],
  :to => 'a_lumbee@gmail.com',
  :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 courriel a été envoyé avec succès.

2voto

stenno Points 21

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

foo = #{23}

Bien sûr que ça ne marchera pas ! Le '#' est pour les commentaires en Ruby SAUF s'il apparaît dans une chaîne ! Il est même 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, puisque c'est déjà une chaîne).

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

a =
b =
42

mettra a et b à 42. Vous pouvez même faire des choses étranges (comme vous l'avez fait accidentellement) et définir 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)

mettra a et b à 42.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X