与设计用户相关联的多个模型-根据角色选择填写一个模型
Multiple models associated with devise user - fill in one model based on selection of role
Im使用design进行用户注册,其中包含字段:电子邮件、密码和角色。
当用户从选择框(学生、教师、管理员)中选择角色时,我希望应用程序呈现其中一个角色的嵌套字段。每个角色存储不同的信息,并以其自身权利作为模型存在。
我有一个javascript,它根据当前选择显示和隐藏适当的div。
问题是,除非我完成所有模型的字段,而不仅仅是当前选择的模型,否则表单无法提交。我意识到这是因为我渲染了所有的部分,然后简单地用javascript隐藏它们。
问题:如何使用javascript仅动态呈现包含当前所选模型的模型字段的部分?
新注册查看
h2>Sign up</h2>
<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= f.error_notification %>
<h3>Login Details</h3>
<br />
<div class = "row">
<div class = "col-md-3"></div>
<div class = "col-md-6"><div class = "panel panel-midnight">
<div class = "panel-heading"><h3 class = "panel-title">Create an account</h3></div>
<div class = "panel-body">
<div class="form-inputs">
<%= f.input :email, :required => true, :autofocus => true, :placeholder => "Enter email address" %>
<br />
<%= f.input :password, :required => true, :placeholder => "Password" %>
<br />
<%= f.input :password_confirmation, :required => true, :placeholder => "Confirm Password" %>
<br />
<%= f.input :role, :label => "I am a:", :collection => ["Student","Teacher","Admin"], :required => true %>
</div>
<h3>Profile</h3>
<div id = "student_fields">
<%= render partial: "student_fields", locals: {:f => f} %>
</div>
<div id = "teacher_fields">
<%= render partial: "teacher_fields", locals: {:f => f} %>
</div>
<div id = "admin_fields">
Admin
</div>
<br />
<% end %>
<br />
</div>
<div class = "col-md-3"></div>
</div>
</div>
</div>
<! Javascript to show/hide specific fields for each role>
<script>
$(document).ready(function(){
if($('#user_role').val() != "Student"){
$("#student_fields").css('display','none');
}
else{
$("#student_fields").css('display','block');
}
$('#user_role').change(function(){
if($(this).val() != "Student"){
$("#student_fields").css('display','none');
}
else{
$("#student_fields").css('display','block');
}
})
});
$(document).ready(function(){
if($('#user_role').val() != "Teacher"){
$("#teacher_fields").css('display','none');
}
else{
$("#teacher_fields").css('display','block');
}
$('#user_role').change(function(){
if($(this).val() != "Teacher"){
$("#teacher_fields").css('display','none');
}
else{
$("#teacher_fields").css('display','block');
}
})
});
$(document).ready(function(){
if($('#user_role').val() != "Admin"){
$("#admin_fields").css('display','none');
}
else{
$("#admin_fields").css('display','block');
}
$('#user_role').change(function(){
if($(this).val() != "Admin"){
$("#admin_fields").css('display','none');
}
else{
$("#admin_fields").css('display','block');
}
})
});
</script>
JavaScript不能只"渲染"您想要的字段。它可以显示/隐藏(正如您试图做的那样),也可以请求动态加载内容(又名AJAX)。如果你想走后一条路线,那么可以考虑将你的个人资料部分更改为这样:
<h3>Profile</h3>
<div id="profile"></div>
然后,您需要设置javascript,根据选择的角色向一个唯一的url发出请求,并用结果填充#profile部分。这里有一个基于jquery的想法。。。
$('#user_role').on('change', function(){
switch( $('#user_role').val() ){
case 'Teacher': targetUrl = '...'; break;
case 'Admin': targetUrl = '...'; break;
default: targetUrl = '...'; break;
}
$('#profile').load( targetUrl );
});
警告一句:通常最好尝试在没有ajax的情况下工作,然后稍后添加ajax,尤其是在刚开始的情况下。您可能需要考虑一个稍微修改过的注册,它的作用更像一个向导——用户可以首先提供用户详细信息(包括角色),当用户成功创建时,响应可以是要求用户提供特定于角色的详细信息。
相关文章:
- Angular没有根据模型更新我的选择元素
- Angularjs:如何让ui选择只有一种方式的模型竞标
- 初始化ng模型时,Angular ui选择占位符不起作用
- 选择框中带有关联的ng模型,选项中带有ng重复
- 角度:仅当选择脏时定义 ng 模型
- 角度指令:当选择更改时,ng 模型未正确更新
- AngularJS绑定模型以选择更新输入数字字段,最小值为最大值
- 选择与ng模型和ng选项绑定时不进行选择
- 与设计用户相关联的多个模型-根据角色选择填写一个模型
- AngularJS:选择不绑定到模型
- 选择框中的ng模型工作不正常
- 使用数组中的嵌套对象在AngularJS中切换用于动态选择菜单的数据模型
- 使用 $q.all 有时会导致选择无法正确读取模型
- 在选择未绑定到模型 Angular js 的日期值时使用日期选择器
- 如何将 HTML 选择绑定到 Rivets.JS 中的模型值
- ng 模型设置值为选择
- 挖空选择框未绑定到初始模型值,而是绑定新值
- 使用 ng 模型选择未选择正确的选项
- Ext JS 4.2:复选框模型选择问题
- 无法按模型选择元素