单选按钮分组在多个嵌套表单条目上

时间:2012-12-26 17:22:20

标签: ruby-on-rails ruby-on-rails-3 radio-button nested-forms

我正在使用带有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插件吗?

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,一个标题有很多角色对象(一个HMT胶水模型,它说哪个人做了那个标题 - 作者,编辑,翻译,等等)。每个标题都有一个主要人物,通常是作者,但有时候是编辑或策展人,就像在百科全书中一样。尽可能地尝试,我无法让Rails在新创建的嵌套模型中使用单选按钮,如您所见。这就是我最终做的事情:

在嵌套的角色部分:

<p>
<%= f.collection_select :name, person_roles, :to_s, :titleize, {:prompt => "Role"}, {:class => 'combo'} %>
&nbsp;
<%= f.collection_select :person_id, Person.order(:sort_name), :id, :reverse_name, :prompt => "Person" %>
<%- if ! f.object.new_record? -%>
&nbsp;
<%= 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? -%>
&nbsp;
<%= 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

因此,除非已保存嵌套模型,否则甚至不会显示单选按钮。添加新的嵌套模型将为您提供一个表单部分缺少单选按钮和删除链接(因为在保存嵌套子项之前两者都不起作用)。