Question

Je suis nouveau à tous les trois, et je suis en train d'écrire un simple formulaire de contact pour un site Web. Le code que je suis venu avec est en bas, mais je sais qu'il ya des problèmes fondamentaux avec elle (en raison de mon manque d'expérience avec sinatra). Toute aide à obtenir ce travail serait apprécié, je ne peux pas sembler figurer dehors / 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
Était-ce utile?

La solution

Je pensais que ce 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"}

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

Autres conseils

Dans le cas où tout le monde peut l'utiliser, voici ce que vous pourriez avoir besoin d'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 besoin d'un success.haml pour indiquer à l'utilisateur que son courriel a été envoyé avec succès.

Hmm, je l'ai essayé dans iRB ce qui suit:

foo = #{23}

Bien sûr, il ne fonctionnera pas! le « # » est pour des commentaires dans Ruby il se produit dans SAUF SI une chaîne! Son même commentaire dans la mise en évidence de la syntaxe. Qu'est-ce que vous vouliez était:

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

comme vous l'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

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

fixera a et b à 42.

# {} est une interpolation qui est utilisé à l'intérieur "". Il suffit 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" 

J'ai créé un exemple en deux parties qui est disponible sur GitHub. L'application de formulaire d'inscription est ici: inscription-form-heroku et un exemple du site statique qui interagit avec c'est ici: statique site web à s3-exemple . L'application de formulaire est construit en utilisant Sinatra et est prêt à déployer directement sur Heroku. Le site statique est prêt à déployer directement à S3 et utiliser Amazon CloudFront.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top