2012-09-27 69 views
0

我需要一个解决方案来隐藏/显示复选框,具体取决于单选按钮的选择。我尝试了不同的解决方案,但我可以让他们工作。Rails 3 - 依赖于单选按钮选择的复选框

上下文: 我有一群联系人可以关联到一个企业。用户可以选择多个联系人,但必须选择一个主要联系人。因此,我有一个单选按钮组让所有联系人选择主要联系人,并且我有一个复选框组,让所有联系人再次选择“其他”联系人。

需要: 现在,我想要做的是,当用户选择单选按钮组中的主要联系人,该联系人将被从“其他联系人”复选框组中删除,因此用户不能选择相同联系两次。我可以使用JQuery以及普通的JavaScript。

CONSTRAINT: 单选按钮组以及复选框组是使用Rails标签助手动态创建的。所以对于元素的ID和名称来说很棘手。另外,业务和联系人之间还有一个很大的差距。

所以单选按钮,我有:

<% @contacts.each do |contact| %> 
<li><%= radio_button_tag 'primary_contact', contact.id, @primary_contact == contact, :class => 'radio'%>&nbsp;&nbsp;<%= contact.name %>,&nbsp;<%= contact.contact_type.name %></li> 
<% end %> 

而对于复选框组,我有:

<%= hidden_field_tag 'business[contact_ids][]', "" %> 
<% @contacts.each do |contact| %> 
<li><%= check_box_tag 'business[contact_ids][]', contact.id, @business.contacts.include?(contact), :class => 'radio' %>&nbsp;&nbsp;<%= contact.name %>,&nbsp;<%= contact.contact_type.name %></li> 
<% end %> 

关于其他设计任何建议(使用单选按钮和复选框... )实现我的目标非常受欢迎。

感谢 阿兰

回答

1
<li><%= radio_button_tag ... :id => "#{contact.id}", :onclick => 'removeFromOtherList(this.id);' %><%= " #{contact.name}, #{contact.contact_type.name}" %></li> 

这样你的HTML标签ID的联络人ID。 ONCLICK它会删除\禁用其他接触

执行相同的其他联系人

...<%= check_box_tag ... :class => 'radio', :id => "otherContact#{contact.id}" %> ... 

然后我们可以remvoe从另一个列表

function removeFromOtherList(contactId) { 
    $("#otherContact"+contactId).parent().remove(); //to remove the LI 
} 

Demo

正确的联系编辑:

一种方式来做到这一点是使用显示/隐藏,并保留最后选定的无线跟踪

var lastSelectedRadioId = null; 
function removeFromOtherList(contactId) { 
    $("#otherContact"+contactId).parent().hide(); 
    if(lastSelectedRadioId){ 
    $("#otherContact"+lastSelectedRadioId).parent().show();  
    } 
    lastSelectedRadioId = contactId; 
} 

Demo

+0

感谢@ D3mon,它的工作原理。但是,如果我删除元素,则会出现另一个问题。如果我的用户选中一个单选按钮,相应的复选框就会消失,但是如果他选择了另一个单选按钮,则删除的复选框不会再出现在列表中! – Alain

+0

检查编辑。 –

+0

太棒了! +1,以便对我的评论做出快速响应。非常非常感谢你。 – Alain