Rails上未初始化的常量4

时间:2016-03-09 17:44:25

标签: ruby-on-rails email ruby-on-rails-4 actionmailer

我正在尝试建立我的第一个联系表单,这会将某人的姓名,电子邮件和消息发送到我的电子邮件地址。我已经看过很多教程并回答了有关stackoverflow的问题,但它并没有帮助我解决我遇到的问题。我知道这与路由有关,但我无法确定原因和原因。

我收到以下错误:

Routing Error
uninitialized constant ContactController

以下是我的文件:

的routes.rb

match '/send_mail', to: 'contact#send_mail', via: 'post'
match '/mail', to: 'contact#contact', via: 'get'

控制器/ contacts_controller.rb

def send_mail
name = params[:name]
  email = params[:email]
  body = params[:comments]
  ContactMailer.contact_email(name, email, body).deliver
  redirect_to contact_path, notice: 'Message sent'
end

寄件人/ contact_mailer.rb

class ContactMailer < ActionMailer::Base
  default to: 'mymail@gmail.com'

      def contact_email(name, email, body)
        @name = name
        @email = email
        @body = body`enter code here`

        mail(from: email, subject: 'Contact Request')
      end
end

视图/ contact.html.twig

<div class="container-content">
  <div class="container">
    <%= form_tag(send_mail_path) do %>
        <div class="form-group">
          <%= label_tag 'name', 'Name' %>
          <%= text_field_tag 'name', nil, class: 'form-control', placeholder: 'John Doe' %>
        </div>
        <div class="form-group">
          <%= label_tag 'email', 'Email' %>
          <%= email_field_tag 'email', nil, class: 'form-control', placeholder: 'johndoe@domain.com' %>
        </div>
        <div class="form-group">
          <%= label_tag 'comments', 'Comments' %>
          <%= text_area_tag 'comments', nil, class: 'form-control', rows: 4, placeholder: 'How can I help you?' %>
        </div>
        <%= submit_tag nil, class: 'btn btn-default btn-about' %>
    <% end %>
  </div>
</div>

视图/ contact_email.html.erb

<!DOCTYPE html>
<html>
<head>
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <p>Mail received from <%= "#{ @name } (#{ @email }):" %></p>
    <p><%= @body %></p>
</body>
</html>

配置/ initializers.rb

module Contact
  class Application < Rails::Application
    config.action_mailer.delivery_method = :sendmail
    config.action_mailer.perform_deliveries = true
    config.action_mailer.raise_delivery_errors = true
    config.active_record.raise_in_transactional_callbacks = true
  end
end

初始化/ stmp_config.rb

config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :domain               => "gmail.com",
    :user_name            => "mymail@gmail.com",
    :password             => "password",
    :authentication       => :login,
    :enable_starttls_auto => true
}

作为我在铁轨世界中的新手,我不确定我在做什么,但我已经看过许多教程,人们有类似的代码我的,但似乎没有人有这个问题

我哪里出错?

提前谢谢

3 个答案:

答案 0 :(得分:2)

您可能需要更改您的routes.rb,如下所示(联系人而不是联系人):

match '/send_mail', to: 'contacts#send_mail', via: 'post'
match '/mail', to: 'contacts#contact', via: 'get'

答案 1 :(得分:1)

这是创建联系表单的一种方式 - 但它不是真正的 Rails应用程序。它只是一个恰好使用Rails的应用程序。

这就是你如何使用Rails约定来使其更加健壮和不那么混乱。

模型

让我们生成模型和迁移:

$ rails g model enquiry name:string email:string body:text

然后我们运行迁移:

$ rake db:migrate

那么,如果我们只是发送电子邮件,为什么要创建模型呢?因为邮件失败了。而且你不想丢失潜在客户的重要询问。

我们还希望我们的模型验证用户是否提供了必需的字段:

# app/models/enquiry.rb
model Enquiry < ActiveRecord::Base
  validates_presence_of :name, :email, :body
  validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
end

控制器

让我们创建一个RESTful路线:

# config/routes.rb 
# ...
resources :enquiries, only: [:new, :create]

请注意,我们称之为enquiries。我们使用资源send_contact而不是使用面向过程的enquiries路径,它为我们提供了如何显示,创建和更新它的约定。

您可以查看使用$ rake routes生成的路线。

请参阅Resource Routing: the Rails Default

让我们为新路线创建一个控制器:

# app/controllers/enquiries_controller.rb
# note controllers use the plural form
class EnquiriesController < ApplicationController
   # GET '/enquiries/new'
   def new 
     @enquiry = Enquiry.new
   end
   # POST '/enquiries'
   def create
     @enquiry = Enquiry.new(enquiry_params)
     if @enquiry.save
       ContactMailer.contact_email(name, email, body).deliver
       redirect_to root_path, success: 'Thanks for getting in touch, we will look into it ASAP.'
     else
       render :new
     end
   end

   private 
     def enquiry_params
       params.require(:enquiry).permit(:name, :email, :body)
     end
end

视图

我们还需要一个表格:

# app/views/enquiries/new.html.erb
<%= form_for(@enquiry) do |f| %>
  <div class="form-group">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>
  <div class="form-group">
    <%= f.label :email %>
    <%= f.email_field :name %>
  </div>
  <div class="form-group">
    <%= f.label :body %>
    <%= f.text_area :body %>
  </div>

  <%= f.submit %>
<% end %>

通过使用表单构建器和模型,我们的表单将自动&#34;回放&#34;用户提交无效表单时的值。

答案 2 :(得分:0)

您在&ContactController&#39;中遇到的问题 - 它必须是复数形式:&#39; ContactsController&#39;!