我正在尝试创建一个带有下拉列表的表单,用户可以创建一个新对象,例如"创建新"被选中,或者他们可以选择从之前创建的对象中选择,这些对象应该使用相应的数据预填充表单。
目前,我只需要为每个循环填充下拉列表,其中包含先前在表单外部创建的对象,以及创建新对象的表单。
如何使此表单动态化,以便在选择以前选择的对象时,表单预填充并允许编辑?
答案 0 :(得分:1)
您必须向自定义路由发送AJAX GET请求,然后执行响应json
格式的控制器操作,并根据该GET请求中传递的参数返回一个集合。比如,您正在根据选定的品牌加载可用的车型:
路线:
get '/get_models/:make_id', to: 'car_makes#available_models'
控制器动作:
def available_models
@models = Model.where(id: ids)
respond_to do |format|
format.json { render json: @models }
end
end
AJAX请求:
var fetchModels = function(makeId){
$.ajax({
method: 'GET',
url: '/get_models/' + makeId,
success: function(data) {
...
var target = $('select#car_models'); // field to which options are appended
$.each(data, function(id, model){
$(target).append(
$('<option>').text(model).attr('value', id) // populate options );
});
}
...
});
}
然后将AJAX请求设置为触发父.change
字段中的select
事件:
$('select#car_makes').change(function(){
var makeId = $(this).val();
fetchModels(makeId);
});
有许多资源可以解释实现此目的的其他方法:
答案 1 :(得分:0)
所以我最终循环遍历选择下拉列表的所有潜在选项,并使用所有可能的选项循环编辑rails表单,并使用jQuery onchange来显示/隐藏正确的html。
这对我来说并不是一个非常好的解决方案,特别是因为它必须每次都加载所有选项的html ..但我不知道还有什么可做,而且有效。
如果有人想要更好的解决方案,请告诉我们:)