2011-07-15 20 views
3

私は多くの画像を持つページを持っており、それぞれに関連するテキストボックスがあり、その画像にタグを付けることができます。各画像とテキストボックスは部分的な表示でレンダリングされます。現在、私はタグを更新することができ、すべてが完全なページリフレッシュを通じて正しく動作します。私はAJAXでこれをすべてやってみたいと思っていますが、それに問題があります。ここでAJAXで部分図を更新する

は、フォームのコードが部分図である:私は画像のタグを追加するコントローラでupdate_tags方法:で

<% @images.each do |image| %> 
    <div id="image_#{image.id}"> 
    <%= render :partial => "image_tag", :locals => { :image => image } %> 
    </div> 
<% end %> 

<%= image_tag image.src %> 
<%= form_tag :controller => "images", :action => :update_tags, :remote => true, :image => image.id do %> 
    <td><%= label_tag "Tags:" %></td> 
    <td><%= text_field_tag :tags, image.tags %></td> 
    <td><%= submit_tag "Submit" %></td> 
<% end %> 

と部分を呼び出し、メインフォームDBに保存し、そのイメージの部分的なビューをリロードします。ここで

は、コントローラのリダイレクトコードです:

respond_to do |format| 
    format.js 
    format.html { redirect_to :back, :remote => true } 
end 

そしてupdate_tags.js.erb:

$("#image_#{image.id}").html("<%= escape_javascript(render :partial => 'image_tag', :locals => {:image => image}) %>"); 

現在は機能的に取り組んでいるが、ないAJAXの魔法が起こっていません。私はまだRailsとjQueryを学んでいるので、どんな助けでも大歓迎です。私は関連するすべてのコードを含んでいると思いますが、私が提供すべき他のものがあれば教えてください。ありがとう!

答えて

3

私が間違っていることは、画像の各部分に#imageを使用することができないことです(ページにそれらの多くがあると仮定します)。

このような要素IDを使用するときは、ページ全体に対して一意でなければなりません。そうでなければ、jQueryは最初のインスタンス#imageを見つけて停止します。だから、あなたはそれのようになりますので、おそらくなど、機種IDを含めることにより、これらの画像IDのユニークのそれぞれを作成する必要があり#image_1#image_2など

もう一つは

、なぜあなたはで

format.html { redirect_to :back, :remote => true } 

を持っていますAJAXコールのコントローラアクション? AJAXはformat.jsしか返さないため、不要と思われます。たぶん私はそこに何かを誤解しているかもしれない。

残りのコードは正しく表示されます。呼び出し中にupdate_tags.js.erbファイルがレンダリングされていることを確認するには、Railsサーバーのログを確認してください。そうであれば、javascriptエラーが発生します。

更新:あなたはRailsがあなたのAJAXが正しくhttps://github.com/rails/jquery-ujs

あなたはAJAXをやっている場合は、レンダリングされるHTMLを必要としないを呼び出しトリガすることができますので、また、あなたがこのインストールされていることを確認する必要があります。デフォルトでは、AJAX呼び出しとブラウザ呼び出しのため、controller_action_name.js.erbがレンダリングされます。あなたはレールのビューの中にいるbcのあなたは、通常のRubyの文字列補間を行うことはできません<div id="image_#{image.id}">この行で

Started PUT "/images/1/update_tags" for 127.0.0.1 at 2011-07-16 09:33:20 -0400 
    Processing by ImagesController#update_tags as JS 
    Parameters: {"image_id"=>"1"} 
    Image Load (1.6ms) SELECT "images".* FROM "images" WHERE "images"."id" = 1 LIMIT 1 
    CACHE (0.0ms) SELECT "images".* FROM "images" WHERE "images"."id" = 1 LIMIT 1 
Rendered images/update_tags.js.erb (11.3ms) 
Completed 200 OK in 346ms (Views: 23.7ms | ActiveRecord: 1.7ms) 
+0

私は実際にこの質問を投稿した後にあなたが言っていることを正確に自分のdiv IDを更新しました。これは私の仕事で更新されました。私は形式をコメントアウトしました。htmlの行があり、フォームに何かを投稿すると、HMTLがレンダリングされません。 URLとして「http:// localhost:3000/images/update_tags?remote = true&image = 1」が表示され、Railsサーバーに送信されたパラメータが表示されますが、HTMLはレンダリングされません。これは私のjavascriptが呼び出されていないということですか? JSファイルは、コントローラで呼び出されるメソッドの後に名前が付けられるはずです(私の場合はupdate_tags.js.erb)。 – jnevelson

+0

私の更新された答えを見て、私はあなたがRailsのjqueryアダプタを失っている可能性があると思います。これは、RailsがAJAX呼び出しを処理する方法です – iwasrobbed

1

:あなたは、Railsのサーバー出力で次のように表示されるはずです。必要があります<div id="image_<%= image.id %>

関連する問題