2 формы на одной странице, Отправка с использованием Pony в Sinatra, тот же адрес электронной почты

Я использую Pony.mail для отправки почты в Sinatra, то, что у меня сейчас есть две формы: одна, которая отправляет только адрес электронной почты для подписки на рассылку новостей, а вторая форма - это контактная форма, оба выполняют одно и то же действие.

То, что я пытаюсь достичь, - это если поле подписки завершено, а только отправить эти параметры или если контактная форма заполнена и отправлена, то отправьте эти параметры

Вот что я придумал до сих пор, но получая неопределенный метод nil

 post '/' do
  require 'pony'
 Pony.mail(
 :from => params[:name] || params[:subscribe],
 :to => 'myemailaddress',
 :subject => params[:name] + " has contacted you via the Website" ||  params[:subscribe] + " has subscribed to the newsletter",
 :body => params[:email] + params[:comment],
 :via => :smtp,
 :via_options => {
 :address              => 'smtp.gmail.com',
 :port                 => '587',
 :enable_starttls_auto => true,
 :user_name            => 'myemailaddress',
 :password             => 'mypassword',
 :authentication       => :plain, 
 :domain               => "localhost.localdomain" 
 })
  redirect '/success' 
 end

возможно ли это, или каждая форма должна рассматриваться индивидуально?

благодаря

1
nl ja de

1 ответы

Есть несколько этапов, которые я проведу для реорганизации этого кода.

1. Извлеките вещи, которые меняются (и делают их более Rubyish)

post '/' do
  require 'pony'

  from = params[:name] || params[:subscribe]
  subject = "#{params[:name]} has contacted you via the Website" ||
            "#{params[:subscribe]} has subscribed to the newsletter"
  body = "#{params[:email]}#{params[:comment]}"

  Pony.mail(
    :from => from,
    :to => 'myemailaddress',
    :subject => subject,
    :body => body,
    :via => :smtp,
    :via_options => {
    :address              => 'smtp.gmail.com',
    :port                 => '587',
    :enable_starttls_auto => true,
    :user_name            => 'myemailaddress',
    :password             => 'mypassword',
    :authentication       => :plain, 
    :domain               => "localhost.localdomain" 
  })
  redirect '/success' 
end

2. Уточните свои намерения

в этом случае, есть два ответвления через код.

post '/' do
  require 'pony'

  if params[:name] # contact form
    from = params[:name]
    subject = "#{params[:name]} has contacted you via the Website"
  else # subscription form
    from = params[:subscribe]
    subject = "#{params[:subscribe]} has subscribed to the newsletter"
  end

  body = "#{params[:email]}#{params[:comment]}"

  Pony.mail(
    :from => from,
    :to => 'myemailaddress',
    :subject => subject,
    :body => body,
    :via => :smtp,
    :via_options => {
    :address              => 'smtp.gmail.com',
    :port                 => '587',
    :enable_starttls_auto => true,
    :user_name            => 'myemailaddress',
    :password             => 'mypassword',
    :authentication       => :plain, 
    :domain               => "localhost.localdomain" 
  })
  redirect '/success' 
end

(Я не большой поклонник настройки локальных варов в условных ветвях, но мы будем игнорировать это для ясности. Я бы, вероятно, создал хеш до условного с уже сделанными ключами, а затем заполнил его в ветвях, но YMMV .)

3. Извлеките то, что не меняется от того, что делает.

В Sinatra есть настроить блок только для такого рода вещей.

require 'pony'

configure :development do
  set :email_options, {
    :via => :smtp,
    :via_options => {
    :address              => 'smtp.gmail.com',
    :port                 => '587',
    :enable_starttls_auto => true,
    :user_name            => 'myemailaddress',
    :password             => 'mypassword',
    :authentication       => :plain, 
    :domain               => "localhost.localdomain" 
  }
end

Pony.options = settings.email_options

Заметьте, что я добавил : development , поскольку вы можете настроить его по-разному для производства.

Теперь ваш маршрут намного чище и проще отлаживать:

post '/' do

  if params[:name] # contact form
    from = params[:name]
    subject = "#{params[:name]} has contacted you via the Website"
  else # subscription form
    from = params[:subscribe]
    subject = "#{params[:subscribe]} has subscribed to the newsletter"
  end

  body = "#{params[:email]}#{params[:comment]}"

  Pony.mail
    :from => from,
    :to => 'myemailaddress',
    :subject => subject,
    :body => body,

  redirect '/success' 
end

Моим последним советом было бы поставить столько вариантов Pony в ENV vars, что не только сохранит такие вещи, как пароли, но и позволит вам изменить настройки намного проще. Возможно, поместите их в Rakefile и загрузите разные среды для разных контекстов и т. Д.


Чтобы использовать переменные среды, я делаю следующее:

# Rakefile

# in this method set up some env vars
def basic_environment
  # I load them in from a YAML file that is *not* in source control
  # but you could just specify them here
  # e.g. ENV["EMAIL_A"] = "[email protected]"
end

namespace :app do

  desc "Set up the environment locally"
  task :environment do
    warn "Entering :app:environment"
    basic_environment()
  end

  desc "Run the app locally"
  task :run_local => "app:environment" do
    exec "bin/rackup config.ru -p 4630"
  end
end

# from the command line, I'd run
`bin/rake app:run_local`

# in the Sinatra app file
configure :production do
    # these are actual settings I use for a Heroku app using Sendgrid
    set "email_options", {      
      :from => ENV["EMAIL_FROM"],
      :via => :smtp,
      :via_options => {
        :address => 'smtp.sendgrid.net',
        :port => '587',
        :domain => 'heroku.com',
        :user_name => ENV['SENDGRID_USERNAME'],
        :password => ENV['SENDGRID_PASSWORD'],
        :authentication => :plain,
        :enable_starttls_auto => true
      },
    }
end

# then a block with slightly different settings for development
configure :development do
  # local settings…
    set "email_options", {
      :via => :smtp,
      :via_options => {
        :address              => 'smtp.gmail.com',
        :port                 => '587',
        :enable_starttls_auto => true,
        :user_name            => ENV["EMAIL_A"],
        :password             => ENV["EMAIL_P"], 
        :authentication       => :plain,
        :domain               => "localhost.localdomain"
      }
    }
end

Обычно я сохраняю большинство этих параметров в файле YAML локально для разработки, но добавляю их непосредственно на производственный сервер. Есть много способов справиться с этим, YMMV.

3
добавлено
Большое вам спасибо, многое из этого можно извлечь. Я попытался установить переменные ENV, поскольку я не хочу жестко кодировать свои учетные данные в почтовый конфиг, хотя я получаю ошибки проверки SMTP, хотя, когда я жестко кодирую учетные данные, работает, очень странно на этом
добавлено автор Richlewis, источник
также в чем преимущества say params [: name] по сравнению с # {params [: name]}, вы используете интерполяризацию здесь да?
добавлено автор Richlewis, источник
@Richlewis Я обновил ответ с некоторыми вещами о env vars. Интерполяция , да, и это способ, с помощью которого выполняется большинство строк в стиле Ruby. Для меня это лучше читается, и я считаю, что он работает лучше, но не полагайтесь на эту часть памяти! :)
добавлено автор iain, источник
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков