使用 AJAX 更新部分视图

2024-03-02

我有一个包含许多图像的页面,每个图像都有一个关联的文本框,用于提交该图像上的标签。每个图像和文本框都是通过局部视图呈现的。目前,我可以更新标签,并且通过整页刷新一切正常。我希望能够通过 AJAX 完成这一切,但我遇到了一些麻烦。

这是部分视图中的表单代码:

<%= 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 %>

以及调用部分的主要形式:

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

在控制器的 :update_tags 方法中,我将图像的标签添加到数据库,然后想要重新加载该图像的部分视图。

这是控制器的重定向代码:

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,因此我们将不胜感激。我想我已经包含了所有相关代码,但是请告诉我是否还需要提供其他内容。谢谢!


我认为错误的一件事是你不能使用#image对于每个图像 div(假设页面上有很多这样的图像)。

任何时候你使用这样的元素 ID 时,它对于整个页面都必须是唯一的,否则 jQuery 将找到第一个实例#image然后停下来。因此,您需要通过可能包含模型 ID 等来使每个图像 ID 都是唯一的,因此它是#image_1 #image_2 etc.

另一件事是,为什么你有

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

在 AJAX 调用的控制器操作中? AJAX只会返回format.js所以这似乎没有必要。也许我误解了一些东西。

您的其余代码看起来是正确的。您可能需要检查 Rails 服务器日志以确保您的update_tags.js.erb文件正在调用期间呈现。如果是的话,那么你就遇到了 javascript 错误。

Update:您还需要确保已安装此软件,以便 Rails 可以正确触发您的 AJAX 调用https://github.com/rails/jquery-ujs https://github.com/rails/jquery-ujs

如果您使用 AJAX,则不需要呈现 HTML。默认情况下,它会渲染controller_action_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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 AJAX 更新部分视图 的相关文章

随机推荐

  • 在 Angular 7 中使用 getElementById 在 DOM 元素上应用指令

    我有一些由第三方 plotly 生成的 HTML 我很想在它创建的 DOM 元素之一上应用我们已有的指令 该指令在单击时打开一个 colorPicker 并将颜色设置为字符串 我可以通过以下方式到达元素querySelector or ge
  • 英特尔 MKL 错误:参数 6 输入时不正确

    我收到以下错误 Intel MKL ERROR Parameter 6 was incorrect on entry to DGELSD 在 scipy 上运行 Savitzky Golay 过滤器时 函数scipy signal savg
  • 测试 IntegrityError UNIQUE 约束失败

    我对电子邮件和商店有一个 unique together 约束 我使用以下代码来测试唯一约束 我期望通过assertRaise 测试 但结果显示相反 我在这里缺少什么 from django db backends sqlite3 base
  • 散景,仅在单个轴上缩放,相应地调整另一个轴

    如何使散景仅在一个轴上使用缩放并自动缩放对象 以便它们精确地占据给定的空间 并在可缩放轴平行的极值点上添加一些填充 同时将空白空间渲染到范围之外 换句话说 准确地说是 疯狂技能 示例图 https i stack imgur com I3j
  • 仿函数调用和函数调用的详细区别?

    这样做的关键原因是 for each 实际上并没有假设它的第三个参数是一个函数 它只是假设它的第三个 论证是可以的 用适当的参数调用 A 适当定义的对象也可以 作为 而且往往比 更好 功能 例如 更容易 内联应用程序运算符 类而不是内联传递
  • 如何从 Visual Studio 中调试 IIS 上的两个 Web 应用程序/服务?

    在 Visual Studio 2010 中 我想同时调试在 IIS 上运行的两个 Web 应用程序 调试第一个应用程序时一切正常 但是当开始调试第二个应用程序且第一个程序仍处于调试模式时 Visual Studio 会提示 无法在 Web
  • 通过指定坐标检索 html 控件

    如何仅通过指定触发事件的坐标来获取 html 控件的 id 例如onmousedown onmouseup onclick ETC 坐标可以通过以下方式获得 e clientX e clientY其中 e 是事件对象 这个想法是获取在其上完
  • Chrome 不允许 cookie 过期时间少于 4 小时

    我似乎无法在 Google Chrome 中设置寿命较短的 cookie 它们要么没有被设置 要么立即被删除 无法分辨是哪一个 尽管两种方式的结果都是相同的 仅当未来到期时间为 4 小时或更短时 才会发生这种情况 如果过期时间大于 4 小时
  • 如何在 Extjs 4.1 中使用 treecombo

    我找到了导师http www sencha com forum showthread php 198856 Ext ux TreeCombo http www sencha com forum showthread php 198856 E
  • 验证一组对象是否已正确映射

    我正在寻找一套干净的管理方法测试特定的相等性 http blog ploeh dk 2012 06 22 Test specificEqualityversusDomainEquality in F 单元测试 90 的时间里 标准结构平等
  • 在哪里下载 MySQLdump.ext 比 mysqldump.exe 版本 5.7.1.7 更新的版本

    尝试通过 MySQL Workbench 转储简单数据库 方法是单击 服务器 gt 数据导出 gt mydb gt 开始导出 获取消息 mysqldump 版本不匹配 该消息显示这些版本 mysqldump exe 版本 5 7 1 7 M
  • 如何让我的 Yubikey 在 Windows 10 中与 SSH 配合使用?

    在出于技术兴趣购买了 Yubikey 5 NFC 固件 5 2 7 并尽可能设置 FIDO2 身份验证后 我遇到了无法再通过 SmartGit 连接到我的 GitLab 服务器的问题 因为没有请求第二个因素 因此我无法连接到服务器 然后我决
  • Neo4j gem - 处理管理关系的首选方法

    这主要是一个设计 效率问题 但我想看看在 Neo4j 中是否有一种首选方法来处理这个问题 而不是在 sql 数据库中如何处理 现在我有 2 个模型 user and event 我之间也有关系user and event表示他们将参加该活动
  • 在 groovy shell 中使用 groovy 类别

    我正在使用 Groovy 类别在一些 DSL 下工作 我想找到一种方法来使用我的 DSL 和 groovy shell 而无需显式编写use MyCategory myObject doSomething 对于每个命令 例如 假设我有以下玩
  • 使用 JPA 从表中删除所有行

    我想使用 JPA 删除特定表中的所有行 我做了什么 public class EmptyBomTables extends HttpServlet private static final long serialVersionUID 1L
  • 如何同步向mongo插入数据(Nodejs、Express)

    我在使用 node express 将数据插入 mongodb 时遇到问题 我的代码如下所示 router get data section sort function req res next Deleting old data alwa
  • Python3 openpyxl 将包含特定值的行中的数据复制到现有工作簿中的新工作表

    我正在尝试将其中包含特定值的行复制到新工作表中 在查看下面列出的参考资料时 我能够确定如何使用 ws append 进行复制 但这在脚本中无法正常运行 我想做的是迭代 wb 如果它具有特定值 则创建另一个工作表并将该行复制到该工作表 我将不
  • 在函数中使用 Config::set() 两次的方法

    我已经用谷歌搜索和 stackoverflowed 如果可以的话 来解决这个问题 但找不到足够简洁的答案 一些参考文献 Laravel 4 当使用 Config set 更改 auth model 时 Auth user 不起作用 http
  • Swift - 合并订阅未被调用

    最近 我尝试使用freshOS 网络 https github com freshOS Networking快捷的包裹 我读了好几次自述文件 但无法让它与我一起工作 我正在尝试获取使用公共 API 服务的国家 地区列表 这就是我所做的 Mo
  • 使用 AJAX 更新部分视图

    我有一个包含许多图像的页面 每个图像都有一个关联的文本框 用于提交该图像上的标签 每个图像和文本框都是通过局部视图呈现的 目前 我可以更新标签 并且通过整页刷新一切正常 我希望能够通过 AJAX 完成这一切 但我遇到了一些麻烦 这是部分视图