Formularz kontaktowy w ruby, sinatra i haml

Jestem nowy dla wszystkich trzech, i staram się napisać prosty formularz kontaktowy dla strony internetowej. Kod, który wymyśliłem, znajduje się poniżej, ale wiem, że są z nim podstawowe problemy (z powodu mojego braku doświadczenia z Sinatrą). Jakakolwiek pomoc w uzyskaniu tego działania byłaby mile widziana, nie mogę dowiedzieć się / znaleźć dokumentacji dla tego rodzaju rzeczy.

Kod Haml ze strony kontaktowej:

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

A oto mój kod w aplikacji Sinatry.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
Author: dcb, 2010-01-15

5 answers

Rozgryzłem to dla każdego z was zastanawiającego się:

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

I aplikacji.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
Author: dcb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-11 18:56:49

Jeśli ktoś może tego użyć, oto, czego możesz potrzebować, aby użyć konta gmail do wysyłania poczty.

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

Zwróć uwagę na przekierowanie na końcu, więc będziesz potrzebował sukcesu.haml, aby wskazać użytkownikowi, że jego e-mail został wysłany pomyślnie.

 4
Author: Lumbee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 00:45:49

Uhmm, próbowałem w irb:

foo = #{23}

Oczywiście, że nie zadziała! '#'jest dla komentarzy w Rubim, chyba że występuje w łańcuchu! Jego nawet skomentowane w podświetlanie składni. Czego chciałeś:

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

Tak jak w Twoim rozwiązaniu(co nie jest konieczne, ponieważ jest już ciągiem znaków).

Btw, powodem, dla którego kod nie wyrzuca błędu jest:

a =
b =
42

Ustawi a i b na 42. Można nawet zrobić kilka dziwnych rzeczy (jak przypadkowo did) i ustawić zmienne na wartość zwracaną funkcji, która przyjmuje te zmienne jako parametry:

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

Ustawi a i b na 42.

 3
Author: stenno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 09:49:21

# {} jest interpolacją używaną wewnątrz "". Samo użycie go na zewnątrz do przypisania zmiennej nie zadziała.

Byłoby bardziej prawdopodobne, aby być używane w ten sposób:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight" 
 1
Author: Russell Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-12 00:41:28

Stworzyłem przykład tego w dwóch częściach, który jest dostępny na GitHubie. Aplikacja signup form znajduje się tutaj: signup-form-heroku i przykład statycznej strony internetowej, która z nią współdziała, jest tutaj: static-website-to-S3-example . Aplikacja form została zbudowana przy użyciu Sinatry i jest gotowa do wdrożenia bezpośrednio na Heroku. Strona statyczna jest gotowa do wdrożenia bezpośrednio na S3 i korzystania z Amazon cloudfront.

 0
Author: Jason Robert Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-01 08:00:15