2010-11-18 8 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とデベロッパーツールでデバッグしようとしましたが、初めてリンクをクリックしたときにサーバーの応答を見ることができます。 何か問題があります。<%= escape_javascript(render(:partial => "books")) %>によって生成されたHTMLには、部分的な内容の古い内容の間違ったHTMLが含まれています。 2回目または3回目のクリックだけが更新されたHTMLを表示します。

私はjquery-ujsを統合しました。これは、最初に部分的に更新されないか、他に何か不足しているという理由ですか?

これは本当に私に頭痛を与えました、あなたは私を助けることができますか?

編集: これが役立つ場合:application.js内のリスナーをajax:beforeajax:completeに作成しました。最初のものは少しスピナーを示し、2番目のものはそれを隠しています。 リンクをクリックするとスピナーが表示されますが、非表示にはなりません。

答えて

1

問題の原因となっている注文問題があるようです。完全な書籍セットを@books変数に取り込み、1つの書籍の別のコピーを変更しています。この変更は反映されません。注意点としては

# 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') 

簡単なJavaScriptを使用し、RJSはあなたが重労働の多くを排除することができます。あなたは何も相当するものがない場合のためにもRJSでJSを使用することができます。

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

これ以上のレールを使いやすくするには、ローカル変数が冗長になるだろうどの_bookあなたの部分を呼び出すことができます。各パーシャルには、テンプレート名と一致する名前のデフォルト変数があります。

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

ありがとうございます。注文を変更すると私の問題が解決しました。 :) 私がしようとしているのは、何らかのスイッチです。「読んだ」本をクリックすると、「未読」とマークされ、逆も同様です。 したがって、私は現在の値を読み込み、反転して元に戻しています。私はより良い方法を見つけることができませんでした。 – dmnkhhn

関連する問題