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 如果使用resourceresources,还要确保controllers 总是复数,如@max 所说,否则Rails 迟早会因我的经验而感到困惑。另一方面,您的联系人只有一个方法,您可以为此添加手动路由,而不要依赖 Rails 自动命名魔法:
# routes

  post "/contact"

# this should also generate a `contact_path` helper, which you can use in the 

【讨论】:

form_with 可能无法推断路径,因为@contactnil。在这种情况下,model 是不必要的(关键字model: 默认为nil),单独使用url 就足够了。 @engineersmnky 好点!作者也可以设置@contact变量,或者直接传form_for Contact.new, url: contact_path 感谢@engineersmnky 和@stwienert,我已经编辑了问题中的代码以反映您编写的更改。今天我学到了很多关于 form_forform_with 的知识,很高兴有一个有知识分享的人网络 这里的建议充其量是有问题的,只是解决根本问题。

以上是关于Rails ActionController::RoutingError (没有路由匹配 [POST] "/"):的主要内容,如果未能解决你的问题,请参考以下文章

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

Rails:如何在 Rails 中为 Devise 设置密钥?

从 Rails 2 到 Rails 3 路由

Rails:在 Rails 控制器中捕获所有异常

如何在带有 Rails 4.2 的专用调试端口上使用工头启动 Rails?

Rails 4 的 Rails_admin 批量分配错误