我正在使用带有simple_form和cocoon的RoR来处理这种结构:Node has_many :addresses
每个Address
都有一个布尔:main
字段,它将每个节点地址中的一个标记为主要地址(实际上是用于SNMP监控的地址)。
我有一个嵌套的表单来管理这些地址,但我找不到一个干净的方法来选择主要地址。
逻辑上,我应该使用一个单选按钮组,每个地址都是一个单选按钮组,但是,在嵌套表单中,每个单选按钮都属于一个地址并且名称不同,这意味着它们位于不同的组中
我可以将单选按钮输入链接到Node中的虚拟属性,并在回调中将所选地址“:main
字段设置为true
”,但如何将每个按钮链接到其地址(I可以使用地址ID作为按钮值,但新添加的地址还没有ID。
这是我的Node表单应该是什么样子的简化版本(括号表示单选按钮,文本输入的括号):
Name : [MyNode1 ]
| Address | Main |
|------------|------|
| [10.0.0.1] | (*) |
| [10.0.0.2] | ( ) |
| [10.0.0.3] | ( ) |
我唯一的另一个解决方案是JS feeded选择框(当我在地址列表中更改某些内容时更新了选项),但它肯定不如简单的无线电组那么干净和合乎逻辑......
修改
“可接受的”解决方法是将单选按钮分组到除name
属性之外的其他内容(例如:data-group
属性)。有人知道任何可以做到这一点的好的JS / jQuery插件吗?
答案 0 :(得分:0)
我有一个类似的问题,一个标题有很多角色对象(一个HMT胶水模型,它说哪个人做了那个标题 - 作者,编辑,翻译,等等)。每个标题都有一个主要人物,通常是作者,但有时候是编辑或策展人,就像在百科全书中一样。尽可能地尝试,我无法让Rails在新创建的嵌套模型中使用单选按钮,如您所见。这就是我最终做的事情:
在嵌套的角色部分:
<p>
<%= f.collection_select :name, person_roles, :to_s, :titleize, {:prompt => "Role"}, {:class => 'combo'} %>
<%= f.collection_select :person_id, Person.order(:sort_name), :id, :reverse_name, :prompt => "Person" %>
<%- if ! f.object.new_record? -%>
<%= radio_button_tag 'title[role_id]', f.object.id, (@title.role_id == f.object.id) %>
<%= label_tag :role_id, "Primary", :for => "title_role_id_#{f.object.id}" %>
<%- end -%>
<%- if ! f.object.new_record? -%>
<%= f.link_to_remove "Delete", :class => 'delete' %>
<%- end -%>
在标题模型中:
has_many :roles, :dependent => :destroy
has_many :people, :through => :roles
belongs_to :role #the primary person, like the author or editor
accepts_nested_attributes_for :roles, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
after_create :set_primary
def set_primary
self.update_attributes( :role_id => self.roles.first.id ) if self.roles && self.roles.first
end
因此,除非已保存嵌套模型,否则甚至不会显示单选按钮。添加新的嵌套模型将为您提供一个表单部分缺少单选按钮和删除链接(因为在保存嵌套子项之前两者都不起作用)。