2011-05-10 23 views
1

當我通過腳手架控制器創建一個新對象時,如果我將一些jquery腳本操作到我的窗體中,並且這些腳本在我的控制器中觸發一個函數,則此函數不知道對象I剛創建。爲什麼?瞭解使用jQuery的rails可變持久性

讓我解釋一下:

在我的控制,我首先要創建我的對象:

def new 
    @projectmilestone = Projectmilestone.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @projectmilestone } 
    end 
    end 

在我看來,我有一個表格有一個嵌套的部分:

<%= semantic_form_for [:projects,@projectmilestone] do |form| %> 

    <%= form.semantic_errors :state %> 
    <%= form.inputs do %> 
     <%= form.input :department_id, :as => :select, :collection => Department.all%> 
     <div id="stakeholders"> 
      <%=render :partial => "stakeholders", :locals => {:users => @users }%> 
     </div> 

    <% end %> 

    <%= form.submit "Submit" %> 

<% end %> 

的利益相關者部分是這樣的:

<%= semantic_form_for [:projects,@projectmilestone], :remote => true do |form| %> 
    <%= form.inputs :partial do %> 
     <%= form.input :user_id , :as => :select, :collection => users %> 
    <% end %> 
<% end %> 

當我改變DEPARTMENT_ID值,JavaScript函數觸發我的application.js文件:

$('#projectmilestone_department_id').live('change', function() { 
    // make a POST call and replace the content 
    var department = $('select#projectmilestone_department_id :selected').val(); 
    if(department == "") department="0"; 
    var milestone = $('#form_id').html(); 
    jQuery.get('/projects/projectmilestones/update_user_select/' + department, function(data){ 
     $("#stakeholders").html(data); 
    }) 
    return false; 
    }); 

這個函數調用函數update_user_select在我的控制器:

def update_user_select 
    users="" 
    users = User.where(:department_id=>params[:department_id]) unless params[:department_id].blank? 
    render :partial => "stakeholders", :locals => {:users => users } 
    end 

的用戶部分應該再重新加載我的表單,但它不會因爲@projectmilestone爲零。

爲什麼@projectmilestone在我使用這個jquery腳本時沒有持久化,並且在我去腳手架的創建函數時持久化?

非常感謝!

回答

0

原因是當Rails呈現您的頁面時,您在控制器中設置的實例變量在視圖和部分之間共享。 它是堆棧的一部分,服務器端並在您的瀏覽器中發送給客戶端。

但是,當您使用Ajax時,您正在從客戶端開始工作,除非您通過發送正在處理的對象的ID來記住它,否則服務器不知道它發送的內容。

+0

感謝您的回答。當我保存(sql插入)對象時,對象的id不是在db中設置的對象,對吧?那麼,如何將此對象ID發送給控制器,並讓控制器在我的update_user_select方法中使用它? – ndemoreau 2011-05-10 20:58:36

+0

你是對的,它不是未來的數據庫對象的ID。但爲了保存單個對象,您應該生成與已存在的html一致的html。也許手動執行而不是使用表單助手會更容易。你可以在瑞安貝茨代碼中獲得靈感。看到https://github.com/ryanb/nested_form – apneadiving 2011-05-10 21:22:27

+0

我看了一下,但對我來說太複雜了......現在,作爲解決方法,我添加了@projectmilestone = params [:id] .to_i!= 0 ? Projectmilestone.find(params [:id]):我的控制器函數中的Projectmilestone.new。儘管事實上它不是非常優雅,但它似乎能夠完成這項工作......謝謝! – ndemoreau 2011-05-10 21:38:21