Контактная форма в рубине, синатре и хамле - PullRequest
28 голосов
/ 15 января 2010

Я новичок во всех трех, и я пытаюсь написать простую контактную форму для веб-сайта. Код, который я придумал, ниже, но я знаю, что с ним есть некоторые фундаментальные проблемы (из-за моей неопытности в Синатре). Буду признателен за любую помощь в получении этой работы, я не могу найти / найти документацию для такого рода вещей.

код хамла со страницы контактов:

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

А вот мой код в приложении Синатры:

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

Ответы [ 5 ]

44 голосов
/ 15 января 2010

Я понял это для любого из вас, кто интересуется:

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

И 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
4 голосов
/ 30 ноября 2011

Если кто-то может использовать это, вот что вам может понадобиться, чтобы использовать вашу учетную запись Gmail для отправки почты.

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

Обратите внимание на перенаправление в конце, поэтому вам понадобится файл success.haml, чтобы указать пользователю, что его электронная почта была успешно отправлена.

3 голосов
/ 13 июля 2011

Хм, я попробовал в irb следующее:

foo = #{23}

Конечно, это не сработает! '#' - для комментариев в Ruby, ЕСЛИ БУДЕТ, что это происходит в строке! Это даже закомментировано в подсветке синтаксиса. То, что вы хотели, было:

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

как вы сделали в своем решении (что не обязательно, так как оно уже является строкой).

Кстати, причина, по которой код не выдает ошибку, заключается в следующем:

a =
b =
42

установит a и b равными 42. Вы можете даже сделать некоторые странные вещи (как вы это сделали случайно) и установить переменные в возвращаемое значение функции, которая принимает эти переменные в качестве параметров:

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

установит a и b на 42.

1 голос
/ 12 мая 2016

# {} - это интерполяция, которая используется внутри "". Просто использовать его снаружи для назначения переменной не будет работать.

Скорее всего, будет использоваться так:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight" 
0 голосов
/ 01 декабря 2015

Я создал пример этого в двух частях, которые доступны на github. Приложение формы регистрации здесь: signup-form-heroku и пример статического веб-сайта, который взаимодействует с этим, здесь: static-website-to-s3-example . Приложение формы построено с использованием Sinatra и готово для развертывания прямо на Heroku. Статический сайт готов к развертыванию прямо на S3 и использовании облачного фронта amazon.

...