我正在使用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");
});
});
答案 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了,因为点击标签会切换复选框。