代码之家  ›  专栏  ›  技术社区  ›  Jonathan Roy

RubyonRails:has_many关联和表单复选框问题

  •  1
  • Jonathan Roy  · 技术社区  · 11 年前

    我正在使用表单向用户添加类别。在我的表单中,我有许多与可用类别相对应的复选框。用户可以随时选中和取消选中他想要的类别。

    class User < ActiveRecord::Base
      has_many :categories, :through => :classifications
    end
    
    class Category < ActiveRecord::Base
      has_many :users, :through => :classifications
    end
    
    class Classification < ActiveRecord::Base
      belongs_to :user
      belongs_to :category
    end
    
    = form_for @user
      - @all_categories.each do |category|
        %label
          = check_box_tag "user[category_ids][]", category.id, @user.categories.include?(category)
          = category.name
    

    问题是用户无法有效地取消选中某个类别。我理解为什么,但我不知道解决这个问题的最佳方法。

    感谢您的帮助:)

    1 回复  |  直到 11 年前
        1
  •  1
  •   Bob McCown    11 年前

    使用fields_for可能是你最好的朋友

    http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

    例如:我正在做的一个项目有食物,而食物可以有很多食物标签。管理这些标记的表单如下所示:

    = food_form.fields_for "tags" do |tags_form|
      - Tag.all.each_with_index do |tag, index|
        = fields_for "#{type.downcase}[food_tags_attributes][#{index}]", food.food_tags.find_or_initialize_by_tag_id(tag.id) do |tag_form|
          = tag_form.hidden_field :id
          = tag_form.hidden_field :tag_id
          = tag_form.check_box :_destroy, {:checked => tag_form.object.new_record? ? false: true}, "0", "1"
          = tag_form.label :_destroy, tag.display_name + " #{}"
    

    注意,我使用的是反向的_destroy属性。因此,如果选中该框,它将添加,如果未选中,它将在food.update_attributes上删除它。