Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过嵌套属性| Cocoon gem | Rails更新关联模型上的多个复选框_Ruby On Rails_Nested Attributes_Cocoon Gem - Fatal编程技术网

Ruby on rails 通过嵌套属性| Cocoon gem | Rails更新关联模型上的多个复选框

Ruby on rails 通过嵌套属性| Cocoon gem | Rails更新关联模型上的多个复选框,ruby-on-rails,nested-attributes,cocoon-gem,Ruby On Rails,Nested Attributes,Cocoon Gem,我有一个房子模型,里面有很多房子规则 我在数据库中保存了一些预定义的house_规则,默认情况下允许的列设置为0。例如: <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_规则,默认情况下允许的列设置为0。例如:

<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">
这是我的新表格

编辑: 这是表单为每个复选框生成的代码

<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都为0

相反,我将在新操作中为控制器中的房屋预先创建所有预定义的规则。详情如下:

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>

你能试着用一下吗?如果这没有帮助,请尝试从控制器内部进行调试,以查看参数中是否传递了任何内容。Hello@Diodon,我希望复选框的选中值为“是”,未选中值为“否”。这就是为什么我这么给你的。是的,你是对的。很抱歉你能准确地说出什么不起作用并显示HousesController的操作吗?你是否将你的代码与演示项目中的_任务和_子任务进行了比较。。。在一个工作示例中进行测试时,部署它帮助了我。非常感谢@nathanvda,它现在可以正常工作了。谢谢你抽出时间。
<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
<%= 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 %>
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">
def new
 @house = House.find(params[:id])
 @house.house_rules.build
end
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>