通过嵌套属性更新关联模型上的多个复选框 |茧gem | Rails
Update multiple checkboxes on association model through nested attributes | Cocoon gem | Rails
我有一个房屋模型,has_manyhouse_rules
class House < ActiveRecord::Base
has_many :house_rules, dependent: :destroy
accepts_nested_attributes_for :house_rules, reject_if: :all_blank, allow_destroy: true
end
这里是house_rule模型
class HouseRule < ActiveRecord::Base
belongs_to :house
enum rule_type: { predefined: 0, user_defined: 1 }
enum allowed: { no: 0, yes: 1 }
end
这里是house_rules
table
的其他栏目
create_table "house_rules", force: :cascade do |t|
t.integer "house_id"
t.string "rule"
t.integer "rule_type", default: 1
t.integer "allowed", default: 0
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我在数据库中保存了一些预定义的 house_rule,allowed
列设置为 0
default.For 例如:
<HouseRule id: 4, house_id: nil, rule: "Smoking allowed", rule_type: 0, allowed: 0, created_at: "2017-03-26 20:54:09", updated_at: "2017-03-26 20:54:09">
我想在新的 house
表格中将所有这些 house_rules
作为 check_boxes。像这样。
因此,当用户选中带有标签 'Smoking allowed' 的复选框时,会像这样创建一条新记录
<HouseRule id: 5, house_id: 1, rule: "Smoking allowed", rule_type: 1, allowed: 1, created_at: "2017-03-26 20:54:09", updated_at: "2017-03-26 20:54:09">
rule_type: 1 #user_defined rule
allowed: 1 #smoking is allowed
这是我的新 house
表格
<%= simple_form_for @house do |f| %>
<div id="house_rules">
<%= f.simple_fields_for :house_rules do |house_rule| %>
<% HouseRule.predefined.each do |rule| %>
<div>
<%= house_rule.label :allowed, rule.rule %>
<%= house_rule.check_box :allowed, {}, 'yes', 'no' %>
</div>
<% end %>
<% end %>
</div>
<% end %>
以上代码按预期显示了复选框,但未按预期工作。有人可以指导我如何完成这项工作吗?
此外,我已经在 HousesController 中将这些列入白名单
house_rules_attributes: [:id, :allowed, :_destroy])
编辑:
这是表单为每个复选框生成的代码
<label for="house_house_rules_attributes_0_allowed">Smoking Allowed</label>
<input name="house[house_rules_attributes][0][allowed]" type="hidden" value="0"><input type="checkbox" value="1" name="house[house_rules_attributes][0][allowed]" id="house_house_rules_attributes_0_allowed">
问题是,所有复选框的 id
和 name
属性都是相同的,所以即使我选中一个复选框,也只会选中第一个复选框。
正在为关联的房屋创建新的 house_rule 记录,但 allowed
值仍然是 0
,而不是 1
。
这是我的HousesController new action
def new
@house = House.find(params[:id])
@house.house_rules.build
end
这不会正确呈现表单,因为您实际上并没有遍历嵌套行,这就是为什么所有行的 id 都为 0 的原因。
相反,我会在控制器中的 new
操作中为 house
预先创建所有预定义规则。如下:
def new
@house = House.new
HouseRule.predefined.each do |hr|
@house.house_rules.build(rule: hr.rule)
end
end
在您看来,只需像往常一样重复内部规则即可:
<%= f.simple_fields_for :house_rules do |house_rule| %>
<%= house_rule.label :allowed, house_rule.object.rule %>
<%= house_rule.check_box :allowed, {}, 'yes', 'no' %>
<% end %>
我有一个房屋模型,has_manyhouse_rules
class House < ActiveRecord::Base
has_many :house_rules, dependent: :destroy
accepts_nested_attributes_for :house_rules, reject_if: :all_blank, allow_destroy: true
end
这里是house_rule模型
class HouseRule < ActiveRecord::Base
belongs_to :house
enum rule_type: { predefined: 0, user_defined: 1 }
enum allowed: { no: 0, yes: 1 }
end
这里是house_rules
table
create_table "house_rules", force: :cascade do |t|
t.integer "house_id"
t.string "rule"
t.integer "rule_type", default: 1
t.integer "allowed", default: 0
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我在数据库中保存了一些预定义的 house_rule,allowed
列设置为 0
default.For 例如:
<HouseRule id: 4, house_id: nil, rule: "Smoking allowed", rule_type: 0, allowed: 0, created_at: "2017-03-26 20:54:09", updated_at: "2017-03-26 20:54:09">
我想在新的 house
表格中将所有这些 house_rules
作为 check_boxes。像这样。
因此,当用户选中带有标签 'Smoking allowed' 的复选框时,会像这样创建一条新记录
<HouseRule id: 5, house_id: 1, rule: "Smoking allowed", rule_type: 1, allowed: 1, created_at: "2017-03-26 20:54:09", updated_at: "2017-03-26 20:54:09">
rule_type: 1 #user_defined rule
allowed: 1 #smoking is allowed
这是我的新 house
表格
<%= simple_form_for @house do |f| %>
<div id="house_rules">
<%= f.simple_fields_for :house_rules do |house_rule| %>
<% HouseRule.predefined.each do |rule| %>
<div>
<%= house_rule.label :allowed, rule.rule %>
<%= house_rule.check_box :allowed, {}, 'yes', 'no' %>
</div>
<% end %>
<% end %>
</div>
<% end %>
以上代码按预期显示了复选框,但未按预期工作。有人可以指导我如何完成这项工作吗?
此外,我已经在 HousesController 中将这些列入白名单
house_rules_attributes: [:id, :allowed, :_destroy])
编辑:
这是表单为每个复选框生成的代码
<label for="house_house_rules_attributes_0_allowed">Smoking Allowed</label>
<input name="house[house_rules_attributes][0][allowed]" type="hidden" value="0"><input type="checkbox" value="1" name="house[house_rules_attributes][0][allowed]" id="house_house_rules_attributes_0_allowed">
问题是,所有复选框的 id
和 name
属性都是相同的,所以即使我选中一个复选框,也只会选中第一个复选框。
正在为关联的房屋创建新的 house_rule 记录,但 allowed
值仍然是 0
,而不是 1
。
这是我的HousesController new action
def new
@house = House.find(params[:id])
@house.house_rules.build
end
这不会正确呈现表单,因为您实际上并没有遍历嵌套行,这就是为什么所有行的 id 都为 0 的原因。
相反,我会在控制器中的 new
操作中为 house
预先创建所有预定义规则。如下:
def new
@house = House.new
HouseRule.predefined.each do |hr|
@house.house_rules.build(rule: hr.rule)
end
end
在您看来,只需像往常一样重复内部规则即可:
<%= f.simple_fields_for :house_rules do |house_rule| %>
<%= house_rule.label :allowed, house_rule.object.rule %>
<%= house_rule.check_box :allowed, {}, 'yes', 'no' %>
<% end %>