Rails ActionController::RoutingError (没有路由匹配 [POST] "/"):
Posted
技术标签:
【中文标题】Rails ActionController::RoutingError (没有路由匹配 [POST] "/"):【英文标题】:Rails ActionController::RoutingError (No route matches [POST] "/"): 【发布时间】:2021-07-15 20:22:58 【问题描述】:导轨 6.0.3
我已经使用gem 'mail_form'
设置了一个静态邮件表单。
我知道它可以正常工作,因为我可以从 rails 控制台发送电子邮件。
问题出在表单上,当我按下提交时,出现路由错误。
ActionController::RoutingError (No route matches [POST] "/"):
主页表单
<div class="container">
<%= form_with model: @contact do |f| %>
<div class="mb-3">
<h3><%= f.label :name, class: "label" %></h3>
<%= f.text_field :name, class: "form-control", placeholder: "Write name in here" %>
<%= f.text_field :email, class: "form-control", placeholder: "Write email in here" %>
<%= f.text_field :message, class: "form-control", placeholder: "Write message in here" %>
<%= f.submit %>
</div>
<% end %>
</div>
routes.rb
resources :contact, only: [:create]
contact.rb
class Contact < MailForm::Base
attribute :name, validate: true
attribute :email, validate: true
attribute :message
def headers
subject: "My Contact Form",
to: 'myemail@gmail.com',
from: %("#name" <#email>)
end
end
contact_controller.rb
class ContactController < ApplicationController
def create
@contact = Contact.new()
@contact.name = params[:name]
@contact.email = params[:email]
@contact.message = params[:message]
if @contact.deliver
render json: message: "Email sent successfully"
redirect_to root_path
else
render json: @contact.errors
end
end
end
我做错了什么或错过了什么步骤?
编辑的控制器
class ContactController < ApplicationController
def create
@contact = Contact.new(contact_params)
if @contact.deliver
redirect_to root_path
else
render json: @contact.errors
end
end
private
def contact_params
params.require(:contact).permit(:name, :email, :message)
end
end
修改后的表格
<div class="container">
<%= form_for Contact.new, url: contacts_path do |f| %>
<div class="mb-3">
<h3><%= f.label :name, class: "label" %></h3>
<%= f.text_field :name, class: "form-control", placeholder: "Write name in here" %>
<%= f.text_field :email, class: "form-control", placeholder: "Write email in here" %>
<%= f.text_field :message, class: "form-control", placeholder: "Write message in here" %>
<%= f.submit %>
</div>
<% end %>
</div>
已编辑路线.rb
resources :contacts, only: [:create]
【问题讨论】:
【参考方案1】:resources :contacts, only: [:create]
资源应该是复数。
class ContactsController < ApplicationController
def create
@contact = Contact.new(contact_params)
if @contact.deliver
# You can't both render and redirect
render json: message: "Email sent successfully"
else
render json: @contact.errors
end
end
private
def contact_params
params.require(:contact)
.permit(:name, :email, :message)
end
end
参数嵌套在params[:contact][:name]
、params[:contact][:email]
等中。使用strong parameters 将参数列入白名单以进行质量分配,而不是充当人工编译器。
【讨论】:
好像表单正试图发布到根目录“/”,这表明在加载主页的操作中没有设置@contact
谢谢。我更改了控制器以包含强大的参数,当我让帖子工作时,我意识到我也无法 re_direct。感谢您对资源也是复数的注释,这很有意义并且解释得很好【参考方案2】:
@form 无法自动解析路径,我认为:
<%= form_with model: @contact do |f| %>
尝试添加一个明确的网址:form_with model: @contact, url: contacts_path
如果使用resource
或resources
,还要确保controllers 总是复数,如@max 所说,否则Rails 迟早会因我的经验而感到困惑。另一方面,您的联系人只有一个方法,您可以为此添加手动路由,而不要依赖 Rails 自动命名魔法:
# routes
post "/contact"
# this should also generate a `contact_path` helper, which you can use in the
【讨论】:
form_with
可能无法推断路径,因为@contact
是nil
。在这种情况下,model
是不必要的(关键字model:
默认为nil
),单独使用url
就足够了。
@engineersmnky 好点!作者也可以设置@contact变量,或者直接传form_for Contact.new, url: contact_path
。
感谢@engineersmnky 和@stwienert,我已经编辑了问题中的代码以反映您编写的更改。今天我学到了很多关于 form_for
和 form_with
的知识,很高兴有一个有知识分享的人网络
这里的建议充其量是有问题的,只是解决根本问题。以上是关于Rails ActionController::RoutingError (没有路由匹配 [POST] "/"):的主要内容,如果未能解决你的问题,请参考以下文章
markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails
Rails:如何在 Rails 中为 Devise 设置密钥?