【问题标题】:Update multiple checkboxes on association model through nested attributes | Cocoon gem | Rails通过嵌套属性更新关联模型上的多个复选框 |茧宝石 |导轨
【发布时间】:2017-03-26 21:42:19
【问题描述】:

我有一个 House 模型,它有_many house_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 表的其他列

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_rules 保存在数据库中,默认情况下 allowed 列设置为 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 表单中将所有这些house_rules 作为复选框。像这样。

因此,当用户选中带有“允许吸烟”标签的复选框时,会像这样创建一条新记录

<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">

问题是,idname 属性对于所有复选框都是相同的,所以即使我选中一个复选框,也只会选中第一个复选框。

正在为关联的房子创建新的 house_rule 记录,但 allowed 的值仍然是 0,而不是 1

这是我的HousesController new action

def new
 @house = House.find(params[:id])
 @house.house_rules.build
end

【问题讨论】:

  • 你能试试只用&lt;%= house_rule.check_box :allowed %&gt; 吗?如果这没有帮助,请尝试从控制器内部进行调试,以查看参数中是否传递了任何内容。
  • 您好@Diodon,我希望复选框的选中值为“是”,未选中值为“否”。这就是我给它的原因。
  • 是的,你是对的。对不起。你能准确地说出什么不起作用并显示 HousesController 的操作吗?
  • 您是否将您的代码与演示项目中的_task & _subtask 进行了比较? (github.com/nathanvda/cocoon_simple_form_demo/tree/master/app/…) ... 在从工作示例进行测试时,部署帮助我解决了问题。

标签: ruby-on-rails nested-attributes cocoon-gem


【解决方案1】:

这不会正确呈现表单,因为您实际上并没有迭代嵌套行,这就是为什么所有行的 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 %>

【讨论】:

  • 非常感谢@nathanvda,它现在工作正常。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多