我正在尝试建立我的第一个联系表单,这会将某人的姓名,电子邮件和消息发送到我的电子邮件地址。我已经看过很多教程并回答了有关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
}
作为我在铁轨世界中的新手,我不确定我在做什么,但我已经看过许多教程,人们有类似的代码我的,但似乎没有人有这个问题
我哪里出错?
提前谢谢
答案 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;!