1

メールの連絡先フォームに mail_form gem と sendgrid を使用しています。しかし、フォームに入力してメッセージを送信すると、正常に送信されません。メッセージを送信することにより、ユーザーは別のページに移動し、メッセージをありがとうと表示されます。

URL と heroku のログにこの utf8=✓&authenticity_token が記録されています。それがこの問題の原因だと思います。皆さん、私を助けてくれませんか?

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"=>"espinozabrand@gmail.com", "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)

そして、ここに私のcontacts_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
4

2 に答える 2

1

utf8これは、およびauthenticity_tokenフィールドに関する質問の最初の部分に答えるはずです: https://stackoverflow.com/a/3836511

Michael Hartl は次のように説明しています

このコードはブラウザーには表示されませんが、Rails によって内部的に使用されるため、その動作を理解することは重要ではありません。簡単に言えば、Unicode 文字 ✓ (チェックマーク ✓) を使用して、ブラウザに正しい文字エンコーディングを使用してデータを送信するように強制し、Rails がクロスサイト リクエスト フォージェリ (CSRF) と呼ばれる攻撃を阻止するために使用する認証トークンを含めます。 .

私はまだこの宝石を扱っていませんが、コンソールを起動して配信をテストしていただけますか? これはうまくいくはずです:

c = Contact.new
c.email = "your@email.com"
c.name = "Your Name"
c.message = "Test Subject"
c.deliver

アップデート:

ログにエラーは表示されません。問題があると思います:

  1. メールが送信されません。 コンソールを使用しているときに電子メールを受け取りましたか? その場合は、フォームから渡されるパラメーターを確認してください。Rails 4 の強力なパラメーターを見てください。ヒント: https://stackoverflow.com/a/24965795

そうでない場合は、私のコンソールの例の手順をもう一度実行し、Frederick Cheung が指摘したように見c.errorsください

  1. フォームを送信した後、ユーザーが「ありがとう」を受け取りません。簡単な方法は、に置き換えることflash.now[:error] = nilですflash.now[:notice] = 'Thank you for your message!'。専用ページが必要な場合は、そのページ、リダイレクト、およびそれに付随するルートが必要です。
于 2016-01-10T22:38:15.853 に答える
0

この問題の解決策を見つけました。上記の解決策のいずれも、それを解決するために機能しません。

何らかの理由で、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>
于 2016-01-14T01:56:35.357 に答える