【问题标题】:Action Mailer configuration difficulties with sendGridsendGrid 的 Action Mailer 配置困难
【发布时间】:2018-03-20 12:55:14
【问题描述】:

我有一个 Rails web application 正在构建中,它的表单是用纯 HTML 完成的。

我在连接表单时遇到困难,以便应用程序使用 Sendgrid 将提交的字段通过电子邮件发送给我。

当我点击表单上的提交按钮时,我得到 No route matches [POST] "/"

我已经按照这个tutorial 并按时间顺序执行了这些说明,但我仍然有麻烦。任何有关代码的指导或帮助将不胜感激。

config/environments/production.rb:

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_startstls_auto => true
  } 

index.html.erb

<form  method="post" name="frmContentDownload"><!-- /. form handling starts here-->

      <div>
        <label for="FirstName1">First Name</label><input class="form-control" name="FirstName1" type="text" value="" />
      </div>

      <div>
        <label for="LastName1">Last Name</label><input class="form-control" name="LastName1" type="text" value="" />
      </div>

      <div>
        <label for="emailAddress">Email</label><input class="form-control" name="emailAddress" type="text" value="" />
      </div>

      <div>
        <label for="PhoneNumber">Phone</label><input class="form-control" name="PhoneNumber" type="text" value="" />
      </div>

      <div>
        <label for="Title1">Title</label><input class="form-control" name="Title1" type="text" value="" />
      </div>


      <!-- /. this is the drop down box for the states-->

      <div><label for="StateProvince1">State or Province</label><select class="form-control" name="StateProvince1">
        <option class="placeholder" value="" disabled selected>COUNTRY &#8609;</option>
        <option value="CA">Canada</option>
        <option value="UK">United Kingdom</option>
        <option value="US">United States</option>
      </select></div>

        <div>
          <label for="comments">Comments</label><input class="form-control" name="comments" type="text" value="" />
        </div>

        <div>
          <input class="btn btn-primary btn-lg btn-block" type="submit" value="Contact Us" />
        </div>

</form>

message.rb

class Message < ApplicationRecord

    include ActiveModel::Model
    include ActiveModel::Conversion
    include ActiveModel::Validations

    attr_accessor :FirstName1, :LastName1, :emailAddress, :PhoneNumber, :Title1, :StateProvince1, :comments

    validates :FirstName1,
       presence: true

    validates :LastName1,
       presence: true


    validates :emailAddress,
       presence: true


    validates :PhoneNumber,
       presence: true


    validates :Title1,
       presence: true


    validates :StateProvince1,
       presence: true


    validates :comments,
       presence: true

end

邮件类

class ContactMailer < ApplicationMailer
    default from: 'notifications@example.com'
    default to: 'chrisdorman1978@gmail.com'

    def welcome_email(user)
        @user = user
        @url = 'http://example.com/login'
        mail(to: @user.email, subject: 'Thank you for the enquiry, Gastromend will be in touch')
    end

    def new_message(message)
        @message = message

        mail subject: "Message from #{message.name}"
    end 

end

控制器

class MessagesController < ApplicationController


    def new
       @message = Message.new
    end


    def create
       @message = Message.new(message_params)

       if @message.valid?
         ContactMailer.new_message(@message).deliver
         redirect_to contact_path, notice: "Your messages has been sent."
       else
         flash[:alert] = "An error occurred while delivering this message."
         render :new
       end
    end 


    private

    def message_params
       params.require(:message).permit(:FirstName1, :LastName1, :emailAddress, :PhoneNumber, :Title1, :StateProvince1, :comments)
    end

end

routes.rb

Rails.application.routes.draw do

root :to => "pages#index"   
  get 'pages/index'

  get 'contact', to: 'messages#new', as: 'contact'
  post 'contact', to: 'messages#create'

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

new_message.text.erb

<%= @message.name %> <<%= @message.email %>> wrote:


<%= @message.content %>

【问题讨论】:

    标签: html ruby-on-rails forms sendgrid


    【解决方案1】:

    看,如果你在控制台上输入rake routes,它就会显示出来

    contact GET    /contact(.:format)          messages#new
            POST   /contact(.:format)          messages#create
    

    这意味着您的帖子操作 URL 是 /contact,那么您的 form 标记将是

    <form action="/contact" method="post" name="frmContentDownload">
    

    另外根据rails form helper为你写的

    为什么你不使用Rails表单标签,看看你是否将它与Rails表单标签一起使用,它会是这样的

    <%= form_tag mail_send_path, method: :post do %>
          <div>
            <label for="FirstName1">First Name</label>
            <%= text_field_tag :FirstName1, nil, class: "form-control", placeholder: "First Name" %>
          </div>
    
          <div>
            <label for="LastName1">Last Name</label>
            <%= text_field_tag :LastName1, nil, class: "form-control", placeholder: "Last Name" %>
          </div>
    
          <div>
            <label for="emailAddress">Email</label>
            <%= email_field :emailAddress, nil, class: "form-control", placeholder: "Email" %>
          </div>
    
          <div>
            <label for="PhoneNumber">Phone</label>
            <%= text_field_tag :PhoneNumber, nil, class: "form-control", placeholder: "PhoneNumber" %>
          </div>
    
          <div>
            <label for="Title1">Title</label>
            <%= text_field_tag :Title1, nil, class: "form-control", placeholder: "Title1" %>
          </div>
    
    
          <!-- /. this is the drop down box for the states-->
    
          <div><label for="StateProvince1">State or Province</label>
            <%= select_tag(:StateProvince1, '<option value="CA">Canada</option><option value="UK">United Kingdom</option><option value="US">United States</option>') %>
          </div>
    
            <div>
              <label for="comments">Comments</label>
              <%= text_field_tag :comments, nil, class: "form-control", placeholder: "comments" %>
            </div>
    
            <div>
              <input class="btn btn-primary btn-lg btn-block" type="submit" value="Contact Us" />
            </div>
    <% end %>
    

    你的路由文件会是这样的

    get 'contact', to: 'messages#new', as: 'contact' post 'contact', to: 'messages#create', as: 'mail_send'

    那么现在如果你运行rake routes 那么它会像这样显示

    contact GET    /contact(.:format)          messages#new
    mail_send POST   /contact(.:format)          messages#create
    

    现在mail_send 是您的表单发布请求路径

    【讨论】:

    • 当我提交表单时,屏幕显示“您想要的更改被拒绝”有什么想法吗?
    • 错误,老实说我想在 php 中这样做,在 1 个文件中而不是 10 个文件中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2014-04-02
    • 2015-11-22
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多