我正在尝试在我的网页上创建一个“联系我们”<section>
,但我遇到了麻烦,因为我不熟悉rails。我希望任何人输入他们的电子邮件,姓名,电话号码和消息,点击submit
后,我们会向他发送一封电子邮件,上面写着他们的姓名,电话号码,电子邮件和消息。我想在没有页面重新加载的情况下这样做。我;我不太确定如何解决这个问题,而且我整天都在阅读帖子和文档,但我仍然无法将各个部分放在一起。
我正在尝试创建表单以将提交的数据传递到我的控制器操作(HomeController
,send_mail
操作),但我目前遇到此错误:
No route matches {:action=>"send_mail", :controller=>"home"}
根据示例1.2(http://guides.rubyonrails.org/form_helpers.html)在我看来,我可以做到这一点
HTML:
<%= form_tag({controller: "home", action: "send_mail"}, method: "post") %>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group">
<%= text_field(:name) %>
</div>
<div class="form-group">
<%= email_field(:email) %>
</div>
<div class="form-group">
<%= telephone_field(:phone) %>
</div>
</div>
<div>
</div class="col-md-6">
</div>
控制器:
class HomeController < ApplicationController
def index
end
def send_mail
name = params[:name]
email = params[:email]
phone = params[:phone]
# body = params[:body]
#UserMailer.contact_mail(name, email, body).deliver
end
end
邮件程序:
class UserMailer < ActionMailer::Base
default to: "myemail@gmail.com"
def contact_mail(name, email, body)
@name = name
@email = email
@body = body
mail(from: email, subject: "Contact Request")
end
end
答案 0 :(得分:2)
我将在此处扩展我的评论作为答案。
您获得的错误没有路线匹配{:action =&gt;&#34; send_mail&#34;,:controller =&gt;&#34; home&#34;} 明确指出您的联系表单无法正常工作的根本问题。无论何时您在服务器端执行某些操作(如调用控制器操作),您都需要一条将请求映射到控制器和操作的路由。如果您打开routes.rb
文件并添加如下所示的行:
AppName::Application.routes.draw do
# ... probably some stuff
post "contact" => "home#send_mail"
# This line generates http://localhost:3000/contact as a valid endpoint for POST
# (create) requests. I chose post because you're creating an email.
# Also note the "home#send_mail" string specifying what to do with this route.
# This is formatted as "controller#action" and is a more standard means to specify
# the controller and action to handle a route.
# ... probably some more stuff
end
当您在那里完成工作后,您的联系表单现在应该提交请求,尽管页面加载。
此外,将此作为路由添加(这是必需的)会为您的视图添加路径助手,而不是使用更简单和可读{action: "send_mail", controller: "home"}
帮助器的那个庞大且依赖于名称的哈希contact_path
。在开发过程中,您希望查看所有有效路由,帮助程序名称和链接控制器操作,只需转到rails项目的根目录并键入rake routes
。
作为最后一点,您希望通过AJAX(或异步)发出请求,以避免在提交联系表单时重新加载页面 - 您将继续remote
之后选项。
<%= form_tag contact_path, remote: true do %>
<!-- Form contents here, as normal, rails' unobtrusive JavaScript will handle
nabbing the forms contents and submitting them asynchronously for you. -->
<% end %>