1

我这里有一个新手问题:)

我希望我的项目有一个主要类别(完成)和一个或多个子类别。我有两个模型 - 一个用于主要类别,一个用于子类别。创建新项目时,我希望能够动态更改子类别的复选框。

我几乎已经用 jQuery 和一个显示复选框的视图请求实现了我想要的。我现在唯一的问题是,当我尝试创建一个新项目并在我渲染“新”时提交无效表单时,已检查的子类别消失了。

以下是我的一些代码:

这是来自我的控制器:

def subcategories 
    @subcategories = Category.find(params[:id]).subcategories
    if !params[:item_id].nil?
        @item = Item.find(params[:item_id])
    else
        @item = Item.new
    end
    render :partial => "subcategories"
end

这是我的看法:

<% if !@subcategories.blank? %>
  <% @subcategories.each do |subcat| %> 
    <%= label_tag dom_id(subcat), subcat.name, :class => "checkbox" do %>
        <%= check_box_tag "item[subcategory_ids][]", subcat.id, @item.subcategory_ids.include?(subcat.id) , id: dom_id(subcat) %> <%= subcat.name %>
    <% end %>
  <% end %>
<% end %>

这是我的 new.html.erb:

<div id="subcategories_main">
    <%= label_tag "Subcategories" %>
    <div id="subcategories">
    </div>
  </div>

我有这个小 JavaScript 来显示复选框:

$("#item_category_id").change(function() {
// make a POST call and replace the content
var category_id = $('select#item_category_id :selected').val();
if(category_id != "" || category_id != "0") 
{
  $.get('/categories/' + category_id + '/subcategories', function(data){
      $("#subcategories").html(data);
  })
}
});
4

1 回答 1

0

表单提交会刷新页面,因此复选框肯定会被清除。

此时你可以做两件事:

  1. 在客户端进行表单验证。因此,您永远不会提交无效的表格。
  2. 或者在控制器中创建另一个全局列表,然后再 render "new"包含选中的子类别(来自参数)。就像是 :

    @checked_subcategories = params[:sub_categories]
    

    然后您可以在迭代时签入视图,例如if @checked_subcategories.include?(name),将复选框标记为已选中。

于 2012-11-18T14:53:57.050 回答