我的表单中有两个选择元素,分类和子类别。首先,仅显示类别选择。当用户在类别选择中进行选择时,将向服务器发送AJAX请求,并显示子类别选择。它工作正常。
现在,当表单提交时出现一些错误,由于任何内容,缺少某些所需的值或任何内容,我会显示错误消息,但我无法保留选择框的相同状态,我只看到类别选择,没有选择值,即初始状态。任何人都可以建议我如何保持这些选择元素的状态吗?
以下是我的新表单中的代码段:
<div id="category-select">
category <%= collection_select :post_category, :id, @categories, :id, :name,
options = {:prompt => "Select a category"} %>
</div>
<div id="sub-category-select">
</div>
这是我的jQuery脚本,当在Category select:
上进行选择时发送AJAX请求$("#post_category_id").change(function() {
var category_id = $('select#post_category_id :selected').val();
if(category_id == "") category_id="0";
$.get('/posts/update_sub_cat/' + category_id, function(data){
$("#sub-category-select").html(data);
})
return false;
});
AJAX请求是在post_controller中的 update_sub_cat 操作中进行的,如下所示:
def update_sub_cat
if params[:id].present?
@sub_categories = Category.find_all_by_parent_id(params[:id])
else
@sub_categories = []
end
respond_to do |format|
format.js
end
端
AJAX请求呈现 update_sub_cat.js.erb 文件,其中我使用了一些HMTL
sub-category <%= collection_select :post_sub_category, :id, @sub_categories, :id, :name,
options = {:prompt => "Select a sub-category"} %>
我知道,我不应该在这里直接使用HTML,而是使用$('sub-category-select).append(...),但我得到它的工作方式,我打算稍后更改它。
这是我程序这一部分所涉及的所有代码。
有人可以帮助我吗?
答案 0 :(得分:2)
我解决了这个问题,并获得了基于AJAX的元素来维护状态。这是我的jQuery代码:
$('#before_category_select').loadPage();
jQuery.fn.loadPage = function(){
if($("#new-post-area").length > 0){
$.getJSON('/home/cat_select_state.json', function(data){
$.get('/posts/update_sub_cat/' + data.cat_state, function(data1){
$("#sub-category-select").html(data1);
})
});
}
}
我调用的控制器操作获取select元素的状态,在页面提交时存储为会话变量:
def cat_select_state
@cat_session = {:cat_state => session[:new_post_category], :sub_cat_state => session[:new_post_sub_category]}
respond_to do |format|
format.json {render :json => @cat_session}
end
end
最后,我使用了选择框的默认值,这些默认值存储为会话变量。如果会话变量为null,则默认值为选择框的提示消息。
<%= collection_select :post_category, :id, @categories, :id, :name,
options = {:prompt => "Select a category", :selected => session[:new_post_category]} %>
子类别选择元素的HTML在javascript文件update_sub_cat.js.erb中呈现。
sub-category <%= collection_select :post_sub_category, :id, @sub_categories, :id, :name,
options = {:prompt => "Select a sub-category"} %>
如果您有任何进一步的改进,请建议。