[英]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_to
或form_with/form_for
创建表单元素并将按钮设置为您想要的样式,因为这会将参数放置在请求正文而不是查询字符串中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.