2011-09-27 59 views
2

我想說明的同樣的事情更簡單的例子:爲什麼我的日誌顯示渲染兩次局部的Rails

Started GET "/greetings/new" for 127.0.0.1 at 2011-09-29 15:30:46 +0700 
    Processing by GreetingsController#new as JS 
    Board Load (0.6ms) SELECT "boards".* FROM "boards" WHERE "boards"."id" = 12 LIMIT 1 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    Upload Load (0.2ms) SELECT "uploads".* FROM "uploads" WHERE ("uploads".uploadable_id = 1 AND "uploads".uploadable_type = 'User') LIMIT 1 
Rendered greetings/_greeting_form.html.erb (108.9ms) 
Rendered greetings/_greeting_form.html.erb (4.1ms) 
Rendered greetings/new.js.erb (116.9ms) 
Completed 200 OK in 302ms (Views: 126.5ms | ActiveRecord: 1.7ms) 

的日誌顯示_greeting_form.html.erb正在呈現兩次。該部分通過對控制器的Ajax調用呈現。

控制器:

def new 
    @greeting = Greeting.new 
    @user = current_user || User.new 
    respond_to do |format| 
     format.js {render :action => 'new'} 
    end 
    end 

new.js.erb

if($('#boxGreeting').length == 0){ 
$('#buttons').after($(" <%=escape_javascript(render 'greeting_form', :user => @user, :greeting => @greeting) %>").fadeIn('fast'));  

      } 
      else 
      { 
      $('#boxGreeting').replaceWith("<%=escape_javascript(render 'greeting_form', :user =>@user, :greeting => @greeting)%>"); 
      } 
+0

你應該裝上新的模板和偏貴的問題,所以我們可以看到發生了什麼,如果它在日誌中呈現,我會在該部分的最開始處放置一個調試器,並計算它被觸發的次數(您也可以使用日誌行來執行) – ecoologic

+0

它是可能你已經獲得了在循環中呈現'invite_form'的語句 - 檢查以確保只有您的意圖纔會呈現您的部分。 – sscirrus

+0

如何添加一個調試器來計算頁面渲染的次數? – chell

回答

2

你在你的new.js.erb調用render 'greeting_form'兩次。如果您在瀏覽器中查看輸出.js文件,則會看到該部分出現兩次。

瀏覽器稍後將評估您的javascript if-clause並使用預渲染的「greeting_form」部分的第一個或第二個。

可避免分配呈現結果給一個變量,然後如果要不部分中使用這個變量解析了兩遍:

var greeting_form = " <%=escape_javascript(render 'greeting_form', :user => @user, :greeting => @greeting) %>"; 
if($('#boxGreeting').length == 0) { 
    $('#buttons').after($(greeting_form).fadeIn('fast'));  
} 
else { 
    $('#boxGreeting').replaceWith(greeting_form); 
} 
+0

你是一個搖滾明星。感謝您清除它,它完美地工作。 – chell