Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Contact form in ruby, sinatra, and haml

I'm new to all three, and I'm trying to write a simple contact form for a website. The code I have come up with is below, but I know there are some fundamental problems with it (due to my inexperience with sinatra). Any help at getting this working would be appreciated, I can't seem to figure out/find the documentation for this sort of thing.

haml code from the contact page:

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

And here is my code in sinatra's app.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
like image 817
dcb Avatar asked Jan 14 '10 22:01

dcb


4 Answers

I figured it out for any of you wondering:

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

And the 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 
like image 110
dcb Avatar answered Oct 11 '22 12:10

dcb


In case anyone can use this, here is what you might need to use your gmail account to send mail.

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 

Note the redirect at the end, so you will need a success.haml to indicate to the user that their email was sent successfully.

like image 23
Mark Locklear Avatar answered Oct 11 '22 10:10

Mark Locklear


Uhmm, i tried in irb the following:

foo = #{23}

Of course it wont work! the '#' is for comments in Ruby UNLESS it occurs in a string! Its even commented out in the syntax highlighting. What you wanted was:

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

as you did in your solution (which is not necessary, as it already is a string).

Btw, the reason why the code does not throw an error is the following:

a =
b =
42

will set a and b to 42. You can even do some strange things (as you accidentally did) and set the variables to the return value of a function which takes these variables as parameters:

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

will set a and b to 42.

like image 21
stenno Avatar answered Oct 11 '22 12:10

stenno


#{} is interpolation that is used inside "". Just using it outside for a variable assignment won't work.

It would be more likely to be used like this:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight" 
like image 38
Russell Brown Avatar answered Oct 11 '22 12:10

Russell Brown