如何配置Pony / Sinatra从两种不同的表单发送数据?

时间:2016-06-20 22:22:25

标签: ruby forms sinatra

我有一个网页,上面有两个表格。 有一个普通的联系表格和一个购物车,如客户的响应部分,供销售人员根据客户的选择做出回应。

我对Ruby一无所知,而且我很难同化这个应该如何处理指向Sinatra电子邮件模板的路由。 代码如下......

**** Mailer.rb ****

    require 'sinatra'
    require 'pony'

    Pony.options = {
      via: :smtp,
      via_options: {
        openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE,
        address: 'mail.myserver.com',
        port: '587',
        user_name: 'test@myserver.com',
        password: '********',
        authentication: :plain,
        domain: "mail.myserver.com" # the HELO domain provided by the client to the server

      }
    }

class Mailer < Sinatra::Base
  post '/contact' do
    options = {
      from: "test@myserver.com",
      to: 'client@clientaddress.com',
      subject: "Contact Form",
      body: "#{params['name']} <#{params['email']}> \n" + params['message']
    }

    Pony.mail(options)

    redirect '/'
  end

 post '/build-tool' do
    options = {
      from: "test@myserver.com",
      to: 'client@clientaddress.com',
      subject: "Custom Build Form",
      body: "#{params['name']} <#{params['email']}> \n" + params['message']
    }

    Pony.mail(options)

    redirect '/'
  end   

end

***** HTML Form One *****

<form class="form-horizontal" method="POST" action="/contact">
 contact information inputs
</form>

***** HTML Form Two *****

<form class="form-horizontal" method="POST" action="/build-tool">
build tool inputs
</form>

***** Config.rb *****

map '/contact' do
  run Mailer
end

map '/build-tool' do
  run Mailer
end

2 个答案:

答案 0 :(得分:0)

  1. Sinatra直接指出路线,所以如果你向'/ contact'发出POST请求,它会调用post '/contact'定义中的代码,所以你不必做任何你做的事情'在config.rb做的。

  2. 当您redirect '/'时,这意味着服务器需要定义根路由,这在您的类定义中是缺失的。

  3. HTML标记进入view,通过Sinatra呈现。

  4. 这些是需要改变的三件事。首先,我们定义一个/路由,它呈现我们需要的HTML表单元素:

    # mailer.rb
    
    require 'sinatra/base' # note the addition of /base here.
    require 'pony'
    
    # pony options code same as before
    
    class Mailer < Sinatra::Base
      get '/' do
        erb :index
      end
    
      # post routes same as before
    end
    

    HTML从视图模板呈现。默认情况下,Sinatra将在views/目录中查找视图。

    # views/index.erb
    
    <form class="form-horizontal" method="POST" action="/contact">
      contact information inputs
      submit button
    </form>
    
    <form class="form-horizontal" method="POST" action="/build-tool">
      build tool inputs
      submit button
    </form>
    

    ERB是一种与Ruby语言捆绑在一起的模板语言,因此您无需安装任何新的gem。还有更多languages listed in the documentation.config.ru将如下所示:

    # config.ru
    # Note the file change. This is called a Rackup file. config.rb is
    # a more general purpose file used by many libraries, so it's better
    # to keep this separate.
    
    require_relative 'mailer.rb'
    
    run Mailer
    

答案 1 :(得分:0)

这里的问题是每个表单对应一个特定的路由,将表单数据发送到该操作。换句话说,“表单一”将POST请求中包含的所有输入字段发送到/contact,“表单二”将POST中的所有输入字段发送到{{1} }。

我的建议是将两个表单合并为一个表单,然后只使用页面样式使其看起来像两个。这样您就可以将所有输入字段一起提交给您的Sinatra应用程序,并且您可以发送最适用于输入内容的任何邮件。