如何在不丢失现有值的情况下编辑复选框

时间:2018-05-20 10:25:23

标签: jquery ruby-on-rails ruby ruby-on-rails-4 checkbox

我正在使用rails构建一个job app。在创建新公司时,用户可以通过复选框在“公司新页面”中选择与公司关联的福利。在用户尝试更新/编辑与公司关联的特权之前,这很有效。

当用户尝试编辑特权时,编辑方法会完全删除现有值,即使用户未在编辑页面中取消选中它们也是如此。例如,公司有养老金和免费午餐等津贴。用户决定编辑此内容并将健康保险添加到现有的特权中。在这种情况下,编辑方法删除养老金和免费午餐,只保存健康保险,尽管用户没有取消退休金和免费午餐。我想要的是编辑/更新方法除了已经存在的值之外还保存新的选中值,前提是它们未被取消选中。以下是编辑页面中的示例代码

<% Perk.all.each do |perk| %>
  <input type="checkbox", class="hidden", value="<%= perk.id %>" 
  name="company[perk_ids][]" id="company_perk_ids_<%= perk.id %>"/>
  <label class="category-choice <%= "active" if 
  @company.perk_ids.include? perk.id %>" for="company_perk_ids_<%= 
  perk.id %>">
   <% perk.name %>
  </label
<% end %>

这是我的公司控制器中的示例代码

  def edit
    @company = Company.find(params[:id])
  end

  def update
    edit
    @company.update(company_params)
    if @company.update(company_params)
      flash[:notice] = "Company profile successfully updated."
      redirect_to @company
    else
      render :edit
    end
  end

在我的js中,我有

$(document).ready(function(){
  $(".category-choice").click(function(){
    $(this).toggleClass("active");
  });
});

1 个答案:

答案 0 :(得分:2)

似乎您可能隐藏了实际的复选框,而是根据标签上的active类显示图像以显示其当前状态。问题在于active类没有正确指示框的已检查状态(因为当选择了类别时,您实际上并未设置要检查的框)。要解决此问题,您需要执行类似

的操作
<input type="checkbox" class="hidden" value="<%= perk.id %>" name="company[perk_ids][]" id="company_perk_ids_<%= perk.id %>" <%= "checked" if @company.perk_ids.include? perk.id %> />

如果不是将CSS基于活跃的&#39;那么这将是显而易见的。类是基于CSS的复选框的状态,如

input[type="checkbox"]:checked + label { ... } # style for your checked box label

然后你就不需要JS了,因为点击标签会切换复选框。