2015-01-14 58 views
0

基於有用的工作解決方案here,我試圖修復我的更新回調以及。如何在JavaScript回調(而不是舊對象)中訪問更新的對象

問題是,我試圖從中提取數據的具體unit始終是舊的緩存版本,即使此回調是由成功的update操作觸發的。

// callback triggered by the update action 

$('.best_in_place').bind("ajax:success", function() { 
    ... 
    console.log(unit.duration); 
    // which is exactly the same as 
    console.log(<%= Unit.find(unit.id).unit_users.pluck(:duration).sum %>); 
    // and both print the OLD duration val instead of the updated val which is in the database 
}); 

和unit_users_controller代碼...

def update 
    @unit = @unituser.unit 

    respond_to do |format| 
     if @unituser.update(unit_user_params) 
     @unit.reload 
     logger.info('-----------------------------------------------------------------') 
     logger.info('@unit.duration in the controller is ' + @unit.duration.to_s) # which is the correct value 
     logger.info('-----------------------------------------------------------------') 
     gon.unit_duration = @unit.duration # an experiment which didn't work for me 
     format.json {respond_with_bip(@unituser) } 
     else 
     # format.html { render :action => 'edit' } 
     format.json { respond_with_bip(@unituser) } 
     end 
    end 
    end 

我試過的unit.reload幾個版本,並沒有什麼幫助。也許我把它放在錯誤的地方?

+0

你可以發佈控制器代碼嗎? –

+0

@RodrigoZurek與控制器代碼無關。控制器與此無關。這是關於錯誤理解'.js.erb'文件的工作原理。 – meagar

+0

它與控制器有關,如果你想更新的對象必須通過控制器,你必須以某種方式恢復它 –

回答

1

我這樣做是一個較早前在這裏是我的代碼,也許它會幫助你:

的Javascript:

$(document).ready(function() { 
    $('.price_bind').bind("ajax:success", function (event, data, status, xhr) { 
     var parsed_data = jQuery.parseJSON(data); 
     $(this).text(parsed_data.newprice); 
     $(this).parentsUntil('body').find(".totalpricep span").text(parsed_data.totalprice); 
    }); 
} 

查看:

<%= best_in_place detail, :price, :classes => 'price_bind', :path => purchase_detail_path(@purchase, detail)%> 

控制器:

def update 
    respond_to do |format| 
     if @detail.update_attributes(params[:detail]) 
     @[email protected]_bal 
     @r=false 
     if @detail.purchase != nil 
      @[email protected] 
     if params[:detail]['status'] && @purchase.step==1 
      @remdet = @purchase.details.where(:step => 1, :status => false) 
      if @remdet.empty? 
      @purchase.update_attribute(:step, 2) 
      @r=true 
      end 
     end 
     else 
      @p=nil 
     end 
     format.html { redirect_to @detail, notice: 'Detail was successfully updated.' } 
     format.json { render :json => {:newprice => @n, :totalprice => @p, :newstatus => @detail.status, :refresh => @r}} 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @detail.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+0

在控制器中format.json是竅門 –

+0

但您的format.json中沒有{respond_with_bip(@unituser)},如果您想更新字段,我認爲這是必需的。 ?? – dwilbank

+0

對象正在響應之前正在更新:@ detail.update_attributes(params [:detail])或任何其他您需要的更新。之後,您可以根據需要響應控制器,在這種情況下,它需要JSON響應,您可以返回所需的新對象的任何方面 –

1

這不是關於緩存。在JavaScript發送給客戶端之前,您的Ruby代碼將被評估爲服務器 -side,並且在AJAX請求發生之前它只會被評估一次。

客戶永遠不會看到這行:

console.log(<%= Unit.find(unit.id).unit_users.pluck(:duration).sum %>); 

所有客戶端將看到的是一樣的東西:

console.log(32); // or whatever the sum is 

不能使用<%= %>這裏。這將永遠給你原來的價值。相反,您需要將新值發送給客戶端以響應AJAX請求。

+0

Woops - 那個Unit.find是一個深夜的愚蠢。現在更清楚了。謝謝! – dwilbank

相關問題