在Ruby、Sinatra和Haml中的联系表单

30

我对这三个东西都很陌生,现在我正在尝试为一个网站编写一个简单的联系表格。下面是我想出来的代码,但我知道它存在一些基本问题(因为我对sinatra不熟悉)。如果有人能帮我让它正常工作,我将不胜感激。我似乎无法找到这类东西的文档。

来自联系页面的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"}

以下是我的sinatra的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

“get”在哪里?你遇到了什么错误? 另外,关于message[mail]的命名有什么问题吗?为什么不直接用“mail”呢? - Jonas Elfström
5个回答

46

我已经弄清楚了,如果你们中有任何人想知道:

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

1
关于标签中 'for' 属性的回应有一点错误: “此属性明确将正在定义的标签与另一个控件相关联。当存在时,此属性的值必须与同一文档中某个其他控件的 id 属性的值相同。当不存在时,正在定义的标签与元素内容相关联。”- http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1 - abernier

6
如果有人需要,这里是使用 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 文件来提示用户邮件发送成功。

1
如果有人在使用这个代码,上面的 :port => '587' 声明会导致错误(下面的 :via_options => { 是有效的)。 - SkeletorFromEterenia

5

嗯,我在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。


2

#{} 是在双引号内使用的插值。仅在变量赋值外部使用它是行不通的。

更可能的用法是这样的:

number_of_people = 15 

Puts "There are #{number_of_people} scheduled tonight" 

0

我已经在Github上创建了一个由两部分组成的示例。注册表单应用程序在这里:signup-form-heroku,与之交互的静态网站示例在这里:static-website-to-s3-example。 该表单应用程序使用Sinatra构建,并可以直接部署到Heroku上。静态网站可以直接部署到S3并使用Amazon CloudFront。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接