2010-11-18 10 views
0

원격으로 실행 된 작업과 링크를 처음 클릭 할 때 업데이트되지 않는 부분에 문제가 있습니다. 뷰 내부부분 클릭이 첫 번째 클릭에서 업데이트되지 않았습니다.

(부분 books 이름) 나는 링크를 만드는 오전 : 또한 책을 읽을 때 다른 텍스트를 표시하는 조건이 routes.rb에 정의되어

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

read_book_path을 .

내 컨트롤러 내부

, 나는 새로운 액션 정의 : 이것은 파일 read.js.erb 필요 의미

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 

,이 파일의 내용은 다음과 같습니다 제가 링크를 클릭하면

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

, 내가 할 수있는 터미널 창에서 데이터베이스 필드가 업데이트되었지만 부분은 업데이트되지 않았는지 확인하십시오. 동일한 링크를 다시 클릭하면 부분이 업데이트됩니다.

링크를 :remote => false으로 변경하더라도 작동하지만 페이지가 (예상대로) 다시로드됩니다.

Safari 및 개발자 도구를 사용하여 디버깅을 시도했으며 링크를 처음 클릭 할 때 서버의 응답을 볼 수 있습니다. 뭔가 잘못되었으므로 <%= escape_javascript(render(:partial => "books")) %>에 의해 생성 된 HTML에 부분 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 

참고로이 작업은 매우 비효율적 인 방식이므로 많은 양의 데이터를 처리하지 않기를 바랍니다. 난 당신이 HTML을 대체해야 html() 방법 때문에 대신 단순히 $(...).html(...)$(...).empty().html(...)를 호출하는 이유를 모르겠어요

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

: 당신은 단순히 간단한 UPDATE 쿼리와 함께 하나 개의 필드를 전환하여이 일을 쉽게 찾을 수 있습니다 그것을 사전에 제거 할 필요가없는 도매.등가가 될 경우 .js.rjs을 사용하는 데 도움이 될

한 가지 : 간단한 자바 스크립트와

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

는 RJS는 천역을 많이 제거 할 수 있습니다. 동등한이없는 경우 당신은 경우에뿐만 아니라 RJS에서 JS를 사용할 수 있습니다

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

이 더 레일 친화적 만들려면, 당신이 부를 수있는 당신의 지역 변수가 중복 만들 것 부분 _book. 각 부분에는 템플릿 이름과 일치하는 이름을 가진 기본 변수가 있습니다.

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

답장을 보내 주셔서 감사합니다. 주문을 변경하면 내 문제가 해결되었습니다. :) 내가하려는 일은 '읽기'책을 클릭하면 '읽지 않음'으로 표시되고 그 반대의 경우에도 스위치로 표시됩니다. 따라서 현재 값을 읽고 반전하고 다시 저장합니다. 나는 더 나은 방법을 찾을 수 없었다. – dmnkhhn

관련 문제