【问题标题】:param is missing or the value is empty: message参数丢失或值为空:消息
【发布时间】:2020-12-30 15:50:22
【问题描述】:

我使用 Sendgrid 在我的 rails 应用程序上构建了一个联系表单。填写联系表格时,出现以下错误消息:

MessagesController#create 中的 ActionController::ParameterMissing

参数丢失或值为空:消息

Started POST "/messages" for ::1 at 2020-12-30 16:41:11 +0100
Processing by MessagesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"uCP2fAxAwk/i8678+LkKyg8LVDpRhrb8CY3sng1z+G7fDMsBzm07IGlG/5Kcqm/GZyzygu0+LKvvUKyVtNuEuA==", "/messages"=>{"name"=>"Coline", "email"=>"test@yopmail.com", "phone_number"=>"0606060606", "message"=>"jhsjhfjqshf"}, "commit"=>"Envoyer"}
Completed 400 Bad Request in 4ms (ActiveRecord: 0.0ms)

谁能帮我找出原因?

我的消息模型:

class Message
  include ActiveModel::Model
  attr_accessor :name, :email, :phone_number, :body
  validates :name, :email, :phone_number, :body, presence: true
end

我的消息控制器:

class MessagesController < ApplicationController
  def new
    @message = Message.new
  end
  
  def create
    @message = Message.new message_params
    if @message.valid?
      MessageMailer.contact(@message).deliver_now
      flash[:success] = "Votre message a bien été envoyé !"
      redirect_to root_path
    else
      flash[:danger] = "Votre message n'a pas pu être envoyé."
      redirect_to root_path
    end
  end

  private
  def message_params
    params.require(:message).permit(:name, :email, :phone_number, :body)
  end

end

我的邮件:

class MessageMailer < ApplicationMailer

  def contact(message)
    @body = message.body
    mail(to: 'myemail@yopmail.com', subject: 'Nouveau message !')
  end 
end

我的邮件邮件视图(在 html.erb 和 text.erb 中):

<%= @body %>

我的联系方式:

<%= form_for messages_path, url: messages_path do |f| %>
  <div class="row">
    <div class="col-lg-4 col-md-4 col-sm-12">
      <%= f.text_field  :name, required: true, class: "form-control", placeholder: "Votre nom" %><br>
    </div>
    <div class="col-lg-4 col-md-4 col-sm-12">
      <%= f.text_field :email, required: true, class: "form-control", placeholder: "Votre email" %><br>
    </div>
    <div class="col-lg-4 col-md-4 col-sm-12">
      <%= f.text_field :phone_number, required: true, class: "form-control", placeholder: "Votre numéro de téléphone" %><br>
    </div>
  </div>

  <%= f.text_area :message,
                  rows: 8,
                  cols: 40,
                  required: true,
                  class: "form-control",
                  placeholder: "Votre message"%><br>

  <%= f.submit 'Envoyer', class: 'btn btn-secondary' %>
<% end %>

在我的 config/environment.rb 以及我的 config/environments/production.rb 和 config/environments/development.rb 中(SENDGRID_LOGIN 和 SENDGRID_PWD 都在我的 .env 文件中):

ActionMailer::Base.smtp_settings = {
    :user_name => ENV['SENDGRID_LOGIN'],
    :password => ENV['SENDGRID_PWD'],
    :domain => 'mydomain.fr',
    :address => 'smtp.sendgrid.net',
    :port => 587,
    :authentication => :plain,
    :enable_starttls_auto => true
  }

我已尝试在我的控制器的 message_params 中删除“require(:message)” --> 在我的浏览器中没有错误消息,但我没有收到任何电子邮件并且我的终端说我有未经许可的参数:

Started POST "/messages" for ::1 at 2020-12-30 16:02:17 +0100
Processing by MessagesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"x+dJYWSNThRzlmLBj9KrUD1ZEkzX1wa67jvOvwNh4vKgyHQcpqC3e/gjM6/rwc5cVX609GtvnO0I5o60usmeJA==", "/messages"=>{"name"=>"Coline", "email"=>"test@yopmail.com", "phone_number"=>"0606060606", "message"=>"jhwsdiufhsukjhdfkdbvf"}, "commit"=>"Envoyer"}
Unpermitted parameters: :utf8, :authenticity_token, :/messages, :commit
Redirected to http://localhost:3000/
Completed 302 Found in 5ms (ActiveRecord: 0.0ms)

【问题讨论】:

    标签: ruby-on-rails ruby sendgrid


    【解决方案1】:

    错误来自params.require(:message),因为您传入的params 不包含:message 键(它有"/messages")。

    这源于您的观点 - 您将 messages_path(即 "/messages")代替字段名称/模型传递给 form_for。试试:

    form_for :message, url: messages_path do |f|
       ...
    

    【讨论】:

    • 感谢您的快速回复!我刚才试过了,现在我的终端说'Unpermitted parameter: :message'。你知道碰巧知道我该如何解决吗?
    • @colinebrlt 那是因为:message 参数不在.permit(:name, :email, :phone_number, :body) 中,这是一个安全功能(这不是错误,但只有允许的参数被传递给模型)。可能表单中的字段应该称为body
    • @colinebrlt 您只需将f.text_area :message 更改为f.text_area :body 以匹配您的Message 类的属性。另外我建议将form_for :message 更改为form_for @message,因为您有一个正式的支持对象
    • 现在像魅力一样工作!非常感谢你们俩
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多