繁体   English   中英

Rails“参数丢失或值为空”错误

[英]Rails “param is missing or the value is empty” error

我有这个 link_to 助手传递一个:email_sequence实例和一个额外的:set_active参数。

然后我尝试使用强参数更新 controller 中的:email_sequence实例,但我收到一条错误消息:

param is missing or the value is empty: email_sequence

链接到:

<%= link_to "Activate", admin_email_sequence_path(base_email.email_sequence, set_active: :true), method: :patch %>

Controller:

class Admin::EmailSequencesController < AdminController
  before_action :set_email_sequence

  def update
    if @email_sequence.update(active: email_sequence_params[:set_active])
      flash[:success] = "Sequence updated succesfully"
      redirect_to_forwarder_or(params[:forwarding_uri], admin_account_emails_path)
    end
  end

  private

  def set_email_sequence
    @email_sequence = current_account.email_sequences.find(params[:id])
  end

  def email_sequence_params
    params.require(:email_sequence).permit(:set_active)
  end
end

这是在params中发送的内容:

{"_method"=>"patch", "authenticity_token"=>"[FILTERED]", "set_active"=>"false", "id"=>"1"}

谁能告诉我我做错了什么?

通过params.require(:email_sequence).permit(:set_active)你期望参数是{ email_sequence: {set_active: "ANY SCALAR VALUE HERE"} }但你只传递set_active你可以通过允许唯一一个参数来修复它

params.permit(:set_active)

首先,您不需要强大的参数。 与流行的看法相反,强参数不会神奇地清理参数。 它只是通过要求您在传递 hash 参数时将参数列入白名单来防止批量分配漏洞。 由于您只使用一个参数,因此没有质量分配漏洞:

class Admin::EmailSequencesController < AdminController
  before_action :set_email_sequence

  def update
    if @email_sequence.update(active: params[:set_active])
      flash[:success] = "Sequence updated succesfully"
      redirect_to_forwarder_or(params[:forwarding_uri], admin_account_emails_path)
    else
      # provide an error response!
    end
  end

  private

  def set_email_sequence
    @email_sequence = current_account.email_sequences.find(params[:id])
  end
end

如果您以后想使用嵌套在 hash 中的多个参数,那么即使可以使用link_to也是非常值得怀疑的。

<%= link_to "Activate", 
            admin_email_sequence_path(
               base_email.email_sequence, 
               "email_sequence[set_active]" => true, 
               "email_sequence[foo]" => "bar"
            ), 
            method: :patch 
%>

使用button_toform_with/form_for创建表单元素并将按钮设置为您想要的样式,因为这会将参数放置在请求正文而不是查询字符串中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM