如何使用复选框(ruby on rails)将模型属性构建为字符串



我有一个具有bw_positions属性的焊接证书模型。我希望能够通过复选框选择焊接位置

<%= check_box_tag "bw_positions[]", "PA" %>PA
<%= check_box_tag "bw_positions[]", "PB" %>PB
<%= check_box_tag "bw_positions[]", "PC" %>PC

并将它们存储为字符串,例如"字符串";PA、PC";或";PA、PB、PC";。

发送到控制器的参数看起来不错:

#<ActionController::Parameters {"_method"=>"patch", "authenticity_token"=>"NSQ9FlN3hqaLbgCkVkDKHgsLOdTp20hkDpXtwqh7ZgiWOB04H0qg6s9_mpyTk03SdFGHRH4paVkA7ZiXvaoCNQ", "welding_certificate"=>{"code"=>"PN EN ISO 9606-1", "number"=>"1234", "material_group"=>"FM5, FM4", "methods"=>"141", "bw"=>"1", "fw"=>"0", "diameter_min"=>"1", "diameter_maks"=>"2", "thk_min"=>"1", "thk_maks"=>"2", "valid_since"=>"2021-04-06", "valid_until"=>"2021-04-28"}, **"bw_positions"=>["PA", "PB"]**, "commit"=>"Zatwierdź", "controller"=>"welding_certificates", "action"=>"update", "welder_id"=>"1", "id"=>"1"} permitted: false>

但数据不会保存到数据库中。。。

2021年4月7日更新我强大的params函数看起来像这个

def welding_certificate_params
params.require(:welding_certificate).permit(:number, :valid_since, :valid_until, :material_group, :diameter_min,                               :diameter_maks, :thk_min, :thk_maks, :methods,                                                :code, :bw, :fw, :body_id, :bw_positions, :fw_positions,                                                :prolongation_date)    
end 

我更改了复选框,使它们看起来像这个

<%= check_box_tag "welding_certificate[bw_positions]", "PA" %>PA
<%= check_box_tag "welding_certificate[bw_positions]", "PB" %>PB

通过这种方式,数据被发送到数据库,但仅作为数组的一个项而不是整个字符串。如果我改为

<%= check_box_tag "welding_certificate[bw_positions][]", "PA" %>PA
<%= check_box_tag "welding_certificate[bw_positions][]", "PB" %>PB

我要

Unpermitted parameter: :bw_positions

在记录器中。。。

我认为你文章中parameters对象的最后一部分可能是问题的一部分:permitted: false意味着params没有通过强参数进行过滤。

我猜您的控制器中有一个名为welding_certificate_params的方法,您需要将其更改为以下内容:

def welding_certificate_params
params.require(:welding_certificate).permit( [whatever other params you have], :bw_positions => [] )
end

有关更多信息,请参阅强参数的api

sam-谢谢

我的控制器

def welding_certificate_params
if params[:bw_positions]
params[:welding_certificate][:bw_positions] = Array(params[:bw_positions]).join(", ")
end
params.require(:welding_certificate).permit(:number, :valid_since, :valid_until, :material_group, :diameter_min,
:diameter_maks, :thk_min, :thk_maks, :methods, 
:code, :bw, :fw, :body_id, :bw_positions, :fw_positions,
:prolongation_date)

end

我的视图

<% positions = ["PA", "PB", "PC", "PD"] %>


<% positions.each do |position| %>
<%= check_box_tag "bw_positions[]", position %><%=" #{position}"%>
<%end%>

它终于工作了:D

最新更新