单一复选框以更新多个属性Rails 4

时间:2014-08-02 16:37:03

标签: ruby-on-rails checkbox

使用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时,问题就消失了。无法弄清楚出了什么问题!

2 个答案:

答案 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

使用更明智的名称替换操作。我只是举个例子。