Ruby on rails 用AJAX更新局部视图
我有一个包含许多图像的页面,每个图像都有一个关联的文本框,用于提交该图像上的标记。每个图像和文本框都通过局部视图进行渲染。目前,我能够更新标签和一切工作正常,通过一个完整的页面刷新。我希望能够通过AJAX实现所有这些,但我在这方面遇到了一些问题 以下是部分视图中的表单代码:Ruby on rails 用AJAX更新局部视图,ruby-on-rails,ajax,ruby-on-rails-3,jquery,Ruby On Rails,Ajax,Ruby On Rails 3,Jquery,我有一个包含许多图像的页面,每个图像都有一个关联的文本框,用于提交该图像上的标记。每个图像和文本框都通过局部视图进行渲染。目前,我能够更新标签和一切工作正常,通过一个完整的页面刷新。我希望能够通过AJAX实现所有这些,但我在这方面遇到了一些问题 以下是部分视图中的表单代码: <%= image_tag image.src %> <%= form_tag :controller => "images", :action => :update_tags, :remote
<%= 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 %>
以及更新_tags.js.erb:
$("#image_#{image.id}").html( "<%= escape_javascript(render :partial => 'image_tag', :locals => {:image => image} ) %>" );
$(“#image#{image.id}”).html(“'image_tag',:locals=>{:image=>image})%>”;
它目前正在功能上工作,但没有AJAX魔术发生。我仍在学习Rails和jQuery,因此非常感谢您的帮助。我想我已经包括了所有相关的代码,但是如果还有什么我应该提供的,请告诉我。谢谢 我认为有一点是错误的,那就是不能对每个图像div使用
#image
(假设页面上有很多图像div)
每当您使用这样的元素ID时,它必须对整个页面是唯一的,否则jQuery将找到#image
的第一个实例,然后停止。因此,您需要通过可能包括一个模型ID等,使每个图像ID都是唯一的。因此,它将是#image_1
#image_2
等
另一件事是,为什么你有
format.html { redirect_to :back, :remote => true }
在AJAX调用的控制器操作中?AJAX只会返回format.js
,因此它似乎没有必要。也许我误解了什么
代码的其余部分看起来是正确的。您可能需要检查Rails服务器日志,以确保在调用期间呈现您的update_tags.js.erb
文件。如果是,那么您有一个javascript错误
更新:您还需要确保已经安装了它,以便Rails能够正确触发AJAX调用
如果使用AJAX,则不需要呈现HTML。默认情况下,它将呈现controller\u action\u name.js.erb
,因为它是AJAX调用而不是浏览器调用。您应该在Rails服务器输出中看到如下内容:
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)
在这一行
中,您不能执行常规的Ruby字符串插值,因为您在rails视图中。需要在发布这个问题后,我实际上更新了我的div id,使之与您所说的完全一致。它现在在我的OP中更新了。我注释掉了format.html行,现在当我提交表单中的内容时,它不会呈现任何HMTL。我看到“”作为URL,我看到Rails服务器中提交的参数,但没有呈现HTML。这是否意味着没有调用我的javascript?JS文件不是应该以在控制器中调用的方法命名吗(在我的例子中是update_tags.JS.erb)?请看我的更新答案,我认为您可能缺少Rails jquery适配器,Rails是如何处理AJAX调用的
format.html { redirect_to :back, :remote => true }
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)