Что такое utf8=✓&authenticity_token и почему он создает конфликты с гемом mail_form?

Я использую гем mail_form и sendgrid для моей контактной формы электронной почты. Но когда я заполняю форму и отправляю сообщение, оно не отправляется успешно. Отправляя сообщение, пользователь должен перейти на другую страницу, где написано «Спасибо за ваше сообщение».

Я получаю этот utf8=✓&authenticity_token в своих журналах URL и heroku. Я думаю, что это то, что вызывает эту проблему. Не могли бы вы, ребята, помочь мне?

2016-01-10T17:49:47.934925+00:00 app[web.1]: Started GET "/contacts/new?utf8=%E2%9C%93&authenticity_token=mzcayVlHayBSxoka6pnUQdjz7OxaPlFICU7L%2FJlfZU4NmyiLypTSbcgaJ%2BRSLZdmhYW3NaxMrZoL0Khwr%2FiRfA%3D%3D&contact%5Bname%5D=Brandon+Espinoza&contact%5Bemail%5D=espinozabrand%40gmail.com&contact%5Bmessage%5D=Hi+how+are+you+msg+me+back+asap+pls&contact%5Bnickname%5D=&commit=Yes%21+Send+It%21" for 71.9.177.97 at 2016-01-10 17:49:47 +0000
2016-01-10T17:49:47.950056+00:00 app[web.1]: Completed 200 OK in 10ms (Views: 9.1ms | ActiveRecord: 0.0ms)
2016-01-10T17:49:47.939506+00:00 app[web.1]: Processing by ContactsController#new as HTML
2016-01-10T17:49:47.939670+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"mzcayVlHayBSxoka6pnUQdjz7OxaPlFICU7L/JlfZU4NmyiLypTSbcgaJ+RSLZdmhYW3NaxMrZoL0Khwr/iRfA==", "contact"=>{"name"=>"Brandon Espinoza", "email"=>"[email protected]", "message"=>"Hi how are you msg me back asap pls", "nickname"=>""}, "commit"=>"Yes! Send It!"}
2016-01-10T17:49:47.947225+00:00 app[web.1]:   Rendered contacts/new.html.erb within layouts/application (6.0ms)

А вот мой contact_controller.rb:

class ContactsController < ApplicationController

  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(params[:contact])
    @contact.request = request
    if @contact.deliver
      flash.now[:error] = nil
    else
      flash.now[:error] = 'Cannot send message.'
      render :new
    end
  end

end

Вот моя форма:

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <h3 class="page-titles">Why Not Say Hello</h3>
    </div>
  </div>

  <div class="row">
    <div class="col-md-6 center-block">
      <form style="padding: 40px 0 40px 0;">
        <%= form_for @contact do |f| %>
          <div class="form-group">
            <%= f.label :name %>
            <%= f.text_field :name, required: true, class: "form-control"  %>
          </div>

          <div class="form-group">
            <%= f.label :email %>
            <%= f.email_field :email, required: true, class: "form-control" %>
          </div>

          <div class="form-group">
            <%= f.label :message %>
            <%= f.text_area :message, as: :text, class: "form-control", :cols => "30", :placeholder => "Your Message", :rows => "10" %>
          </div>

          <div class="form-group hidden">
            <%= f.label :nickname %>
            <%= f.text_field :nickname, hint: 'leave this field blank' %>
          </div>

          <%= f.submit 'Yes! Send It!', class: " btn-default btn sendbtn" %>

        <%end%>
      </form>
    </div>
  </div>
</div>

Вот что должен увидеть пользователь, если электронное письмо успешно отправлено:

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <h3 class="page-titles">Why Not Say Hello</h3>
    </div>
  </div>

  <div class="row">
    <div class="col-md-12">
      <h1>Thank you for your message!</h1>
      <p>I'll get back to you soon.</p>
    </div>
  </div>
</div>

Это мой Production.rb:

config.action_mailer.default_url_options = { host: 'https://espinozabrandblog.herokuapp.com/' }
  config.action_mailer.delivery_method = :smtp

  ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => 'heroku.com',
  :enable_starttls_auto => true
}

Вот мои маршруты:

Rails.application.routes.draw do

  resources :posts
  resources :projects
  resources :contacts, only: [:new, :create]
  get 'welcome/index'
  root 'welcome#index'
end

person Brandon Espinoza    schedule 10.01.2016    source источник
comment
Откуда request в @contact.request = request?   -  person spickermann    schedule 10.01.2016
comment
@spickermann из драгоценного камня mail_form. Вот документы для этого гемма github.com/plataformatec/mail_form.   -  person Brandon Espinoza    schedule 10.01.2016
comment
@mackenzie-child не могли бы вы мне помочь, пожалуйста   -  person Brandon Espinoza    schedule 10.01.2016
comment
Это почти наверняка не проблема. Вы можете попробовать проверить @contact.errors   -  person Frederick Cheung    schedule 11.01.2016


Ответы (2)


Это должно ответить на первую часть вашего вопроса о полях utf8 и authenticity_token: https://stackoverflow.com/a/3836511

Майкл Хартл объясняет это так:

Этот код, который не отображается в браузере, используется внутри Rails, поэтому нам не важно понимать, что он делает. Вкратце, он использует символ Unicode ✓ (галочка ✓), чтобы заставить браузеры отправлять данные с использованием правильной кодировки символов, а затем он включает токен аутентификации, который Rails использует для предотвращения атаки, называемой подделкой межсайтовых запросов (CSRF). .

Хотя я еще не работал с этим драгоценным камнем, не могли бы вы запустить консоль и протестировать доставку там? Это должно работать:

c = Contact.new
c.email = "[email protected]"
c.name = "Your Name"
c.message = "Test Subject"
c.deliver

Обновление:

Ваши журналы не показывают никаких ошибок. Я так понимаю, у вас есть проблемы:

  1. Почта не отправляется. Вы получили письмо при использовании консоли? Если да, то проверьте параметры, которые передаются из формы. Посмотрите на сильные параметры для рельсов 4. Подсказка: https://stackoverflow.com/a/24965795

Если вы этого не сделали, снова выполните шаги в моем примере консоли и посмотрите на c.errors как .

  1. Пользователь не получает "Спасибо" после отправки формы. Проще всего заменить flash.now[:error] = nil на flash.now[:notice] = 'Thank you for your message!'. Если вам нужна выделенная страница, вам нужна эта страница, перенаправление и соответствующий маршрут.
person philip becker    schedule 10.01.2016
comment
Не испортит ли это что-нибудь на сайте? Потому что у меня есть только форма электронной почты и ее функциональность, настроенная для производства. - person Brandon Espinoza; 11.01.2016
comment
Contact.new вернет новый объект Contact, который еще не сохранен в базе данных. Я не знаю, что делают методы deliver, можете ли вы опубликовать соответствующий код? В любом случае вы можете использовать rails console --sandbox для отката любых изменений в базе данных при выходе из консоли. Если все пойдет хорошо, письмо будет отправлено на указанный адрес электронной почты. - person philip becker; 11.01.2016
comment
MailForm::Notifier#contact: обработано исходящей почты за 254,3 мс Отправлено письмо на [email protected] (13,7 мс) Дата: Вт, 12 января 2016 г. 13:53:40 -0600 От: Брэндон ‹[email protected]› Кому : [email protected] Идентификатор сообщения: ‹[email protected]› Тема: Mime-версия контактной формы: 1.0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit ‹h4 style=text-decoration:underline›Контактная форма‹/h4› ‹p›‹b›Имя:‹/b›Брэндон‹/p› ‹p›‹b ›Электронная почта:‹/b› [email protected]‹/p› ‹p›‹b›Сообщение:‹/b› ТЕСТОВЫЙ СУБЪЕКТ‹/p› =› true - person Brandon Espinoza; 12.01.2016
comment
Вот что случилось - person Brandon Espinoza; 12.01.2016
comment
Пожалуйста, постарайтесь быть более ясным в том, что вы пробовали, что происходит и каковы ваши вопросы. См. мое редактирование выше для некоторых указателей. - person philip becker; 13.01.2016
comment
Он отправляет в консоли на мой адрес электронной почты, но он не будет работать, просто заполнив форму. Я добавил параметры, но это все равно не сработает. Я много раз искал, как решить эту проблему, но ничего не нашел - person Brandon Espinoza; 13.01.2016
comment
Спасибо, что были терпеливы со мной. Единственное, что я нашел, это гем github.com/softace/utf8_enforcer_workaround. Как вы думаете, это испортит то, как люди заходят на сайт? Или это просто не очень хорошая идея? - person Brandon Espinoza; 13.01.2016

Я нашел решение этой проблемы. Ни одно из приведенных выше решений не работает для ее решения.

По какой-то причине тег формы из Bootstrap создает конфликт. Таким образом, простое удаление тега <form></form> из Bootstrap позволяет отправить форму.

Таким образом, форма должна выглядеть так

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <h3 class="page-titles">Why Not Say Hello</h3>
    </div>
  </div>

  <div class="row">
    <div class="col-md-6 center-block">
        <%= form_for @contact do |f| %>
          <div class="form-group">
            <%= f.label :name %>
            <%= f.text_field :name, required: true, class: "form-control"  %>
          </div>

          <div class="form-group">
            <%= f.label :email %>
            <%= f.email_field :email, required: true, class: "form-control" %>
          </div>

          <div class="form-group">
            <%= f.label :message %>
            <%= f.text_area :message, as: :text, class: "form-control", :cols => "30", :placeholder => "Your Message", :rows => "10" %>
          </div>

          <div class="form-group hidden">
            <%= f.label :nickname %>
            <%= f.text_field :nickname, hint: 'leave this field blank' %>
          </div>

          <%= f.submit 'Yes! Send It!', class: " btn-default btn sendbtn" %>

        <%end%>
    </div>
  </div>
person Brandon Espinoza    schedule 14.01.2016