2011-08-09 30 views
1

我的表單中有兩個select元素,Category和Sub-category。首先,只顯示類別選擇。當用戶在類別選擇中做出選擇時,會向服務器發送AJAX請求,並顯示子類別選擇。它工作正常。在表單提交錯誤後顯示基於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腳本發送時作出選擇的類別選擇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請求是由上update_sub_cat在post_controller中的操作,如下所示:

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

你將不得不提供更多細節。爲什麼你不能保持選擇框的狀態?你如何顯示錯誤?等等...我們是一個編程社區,向我們展示代碼,以便我們可以提供幫助,否則我們無法做到。 – iwasrobbed

+0

對不起,我認爲這會有一些一般的伎倆,這就是爲什麼我沒有提供細節,我現在詳細說明了我的問題,請看看。謝謝。 – rookieRailer

+0

感謝您對標籤的修改。只顯示我在stackoverflow使用的經驗不足:) – rookieRailer

回答

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); 
     }) 
    }); 
    } 
} 

控制器的行動,我打電話讓選擇元素的狀態,這是在頁面的時間存儲爲會話變量提交:

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 

最後,我爲選擇框使用了一個默認值,它們被存儲爲會話變量。如果會話變量爲空,則默認值是選擇框的提示消息。

<%= 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"} %> 

請建議您是否有任何改進。