使用rails应用程序。我想在编辑视图中使用一个复选框字段,在选中时将多个属性设置为nil。大多数人似乎都有相反的问题:他们想要多个复选框字段保存到一个属性。
我的编辑表单如下所示:
<%= hidden_field_tag "restaurant[weekday_closed_checkbox]", nil %>
<%= check_box_tag "restaurant[weekday_closed_checkbox]", "checked" %>
Weekday_closed_checkbox是一个虚拟属性。它不会保存到数据库中。为了适应这种情况,我的餐厅控制器看起来像这样:
def update
@restaurant = Restaurant.find(params[:id])
if checkbox_params[:weekday_closed_checkbox] == "checked"
@restaurant.weekday_open_at = nil
@restaurant.weekday_close_at = nil
end
if @restaurant.update(restaurant_params)
redirect_to @restaurant
else
render 'edit'
end
end
# . . .
private
def restaurant_params
params.require(:restaurant).permit(:id, :name, :description, ....)
end
def checkbox_params
params.require(:restaurant).permit(:weekday_closed_checkbox)
end
end
我的餐厅模特看起来像这样:
attr_accessor :weekday_closed_checkbox
当编辑视图呈现并且我选中复选框并提交时,参数如下所示:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"DNq3nbGLgPTcvdG3KF8mkyJxm3i0MlQs6TjBd6ylJHQ=", "restaurant"=>{"name"=>"Name", "description"=>"World's best restaurant", . . . "weekday_closed_checkbox"=>"checked"}
但是nil值不会保存到数据库中。
问题不在于更新操作;其他字段可以编辑和保存,没有问题。此外,当我只使用多个复选框将属性设置为nil时,问题就消失了。无法弄清楚出了什么问题!
答案 0 :(得分:0)
update
不会保存您的手册(超过参数)调整。
你需要只操纵参数,比如
if checkbox_params[:weekday_closed_checkbox] == "checked"
params[:restaurant].merge {
weekday_open_at: nil,
weekday_close_at: nil }
end
或者只是做一次保存
@restaurant.attributes = restaurant_params
if @restaurant.save
redirect_to @restaurant
else
render 'edit'
end
但最好在你的模型中以before_save
做。
答案 1 :(得分:-1)
我会做这样的事情:
# _form.html.erb
<%= check_box_tag "restaurant[make_everything_nil]", "checked" %>
然后你得到params[restaurant][:make_everything_nil]
。在您的控制器中,您可以检查它的值:
# xxx_controller.rb
def update
if params[restaurant][:make_everything_nil] == true
# set all the values here
end
# the rest of logic here
end
使用更明智的名称替换操作。我只是举个例子。