2010-11-18 51 views
0

我遇到了遠程執行操作和第一次單擊鏈接時不更新的部分問題。第一次點擊時部分未更新

的視圖中(部分名爲books)我創建一個鏈接:在routes.rb中 還有一個條件在讀這本書,使顯示不同的文本被定義

link_to "⊗", read_book_path(book), :remote => true 

read_book_path

在我的控制,我已經定義了一個新的動作:

def read 
    @books = Book.all 
    @book = Book.find(params[:id]) 
    @book.read = [email protected] 
    @book.save 
    respond_to do |format| 
    format.html { redirect_to(books_url) } 
    format.js {render :layout => false, :locals => { :book => @book } } 
    end 
end 

這意味着我需要一個文件read.js.erb,這個文件的內容是:

$("#books").empty().html("<%= escape_javascript(render(:partial => "books")) %>"); 

當我點擊鏈接,我可以在終端窗口中看到數據庫字段已更新,但部分不是。點擊相同的鏈接再次更新部分。

將鏈接更改爲:remote => false也可以,但頁面會重新加載(如預期的那樣)。

我試圖用Safari和Developer工具調試它,當我第一次點擊鏈接時,我可以看到服務器的響應。 這裏有什麼不對,由<%= escape_javascript(render(:partial => "books")) %>生成的HTML包含錯誤的HTML與部分的舊內容。只有第二次或第三次點擊纔會顯示更新後的HTML。

我已經集成了jquery-ujs - 是部分不會第一次更新的原因還是我缺少其他東西?

這真的讓我頭痛,你能幫我嗎?

編輯: 如果有幫助:我在application.js中創建了一個到ajax:beforeajax:complete的監聽器。第一個顯示一個微調,第二個隱藏它。 當我點擊鏈接時,微調器顯示,但它不隱藏。

回答

1

它看起來像你有一個訂購問題,造成麻煩。您將一整套書籍捕獲到@books變量中,然後修改單獨一本書的單獨副本。此更改不會傳回。

# Load and modify the one book by flipping the flag 
@book = Book.find(params[:id]) 
@book.read = [email protected] 
@book.save 

# Load all books 
@books = Book.all 

作爲一個說明,這是做事的一個極其低效的方式,所以我希望你不工作了大量的數據。您可能會發現它更容易通過簡單地用一個簡單的查詢UPDATE撥動一個領域做到這一點:

Book.update_all({ :read => true }, { :id => params[:id] }) 

我不知道爲什麼你打電話$(...).empty().html(...),而不是簡單地$(...).html(...)因爲html()方法應該取代HTML批發,無需提前清除。

一兩件事,可能有助於使用.js.rjs其中相當於將是:

page[:books].replace_html(:partial => 'books') 

憑藉簡單的JavaScript,RJS讓您消除了很多瑣事。你可以在RJS使用JS以及對於情況下,有沒有相應的:

page << '$("#books").empty()' 
page[:books].replace_html(:partial => 'books') 

爲了使這更Rails的友好,你可以打電話給你的部分_book這將使局部變量是多餘的。每個部分都有一個默認變量,其名稱與模板名稱相匹配:

render(:partial => 'book', :collection => @books) 
+0

謝謝您的回答。改變順序解決了我的問題。 :) 我想要做的是某種開關,點擊一個「讀」書將其標記爲「未讀」,反之亦然。 因此,我正在讀取當前值,將其反轉並保存。我找不到更好的方法。 – dmnkhhn 2010-11-19 00:21:24

相關問題