Контактная форма в рубине, синатре и хамле
Я новичок во всех трех, и я пытаюсь написать простую контактную форму для веб-сайта. Код, который я привел, приведен ниже, но я знаю, что есть некоторые фундаментальные проблемы (из-за моей неопытности с синатрой). Любая помощь при получении этой работы будет оценена по достоинству, я не могу понять, найти/найти документацию для такого рода вещей.
Код haml со страницы контактов:
%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"}
И вот мой код в синатра 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
Ответы
Ответ 1
Я понял, что любой из вас задается вопросом:
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
Ответ 2
В случае, если кто-либо может это использовать, вот что вам может понадобиться для использования вашей учетной записи gmail для отправки почты.
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 => '[email protected]',
:authentication => :plain,
:domain => 'localhost.localdomain'
})
redirect '/success'
end
Обратите внимание на перенаправление в конце, поэтому вам понадобится success.haml, чтобы указать пользователю, что их письмо было успешно отправлено.
Ответ 3
Умм, я пробовал в irb следующее:
foo = #{23}
Конечно, это не сработает! "#" для комментариев в Ruby UNLESS, это происходит в строке! Его даже прокомментировали в подсветке синтаксиса.
Вы хотели:
name = "#{params[:name]}"
как это было в вашем решении (что необязательно, поскольку оно уже является строкой).
Btw, причина, по которой код не вызывает ошибку, заключается в следующем:
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.
Ответ 4
# {} - интерполяция, которая используется внутри "". Просто использование его снаружи для назначения переменной не будет работать.
Скорее всего, будет использовано следующее:
number_of_people = 15
Puts "There are #{number_of_people} scheduled tonight"
Ответ 5
Я создал пример этого в двух частях, доступных в github. Приложение формы регистрации находится здесь: signup-form-heroku и пример статического веб-сайта, который взаимодействует с этим: static-website-to-s3-example.
Приложение формы построено с использованием Sinatra и готово к развертыванию прямо на Heroku. Статический сайт готов к прямому развертыванию на S3 и использует облачную область amazon.