当前位置: 首页 > 知识库问答 >
问题:

从AJAX调用返回的jQuery和$not在like.js.erb中定义

周正真
2023-03-14

我将Rails6与bootstrap和webpack一起使用。一切正常。Bootstrap工作,jQuery工作,等等,直到..

我正在学习这个acts_as_votable教程:https://blog.makersacademy.com/how-to-make-a-dynamic-rails-like-differ-button-using-the-acts-as-votable-gem-9ab71686ff82

当PostController喜欢post时,它进入like.js.erb,然后在浏览器中返回错误

Uncaught ReferenceError: $ is not defined
  at <anonymous>:1:1
  at processResponse (rails-ujs.js:282)
  at rails-ujs.js.195
  at XMLHttpRequest.xhr.onreadystatechang (rails-ujs.js:263)

但是jQuery仍然正常工作,因为我的引导程序没有错误。只有当它通过ajax进入时,它才会失去它。

在PostsController中:

respond_to :js, :html, :json

def like
  @post = Post.find(params[:id])
  if params[:format] == 'like'
    post.liked_by current_user
  elsif params[:format] == 'unlike'
    post.unliked_by current_user
  end
end
$('.liked-btn').on('ajax:success', function(){
  $(this).parent().parent().find('.like-count').html('<%= @post.get_likes.size %> &128591');
  $(this).closet('.liked-btn').html('Like');
});

$('.like-btn').on('ajax:success', function(){
  $(this).parent().parent().find('.like-count').html('<%= @post.get_likes.size %> &128591');
  $(this).closet('.like-btn').html('Liked');
});

注意:我也尝试用jQuery替换$,得到了同样的错误,除了当时用jQuery未知。

共有1个答案

范文昌
2023-03-14

好吧,这似乎是因为即使加载了jQuery,但它在视图中是不可见的(不管这意味着什么,老实说,这不是我的专长领域)。

所以我的测试显示jquery已加载。但它只对WebPack可见?我猜?

修复方法是在app/javascript/packs/application.js中添加以下内容

import $ from 'jquery';
global.$ = jQuery;
const { environment } = require('@rails/webpacker')

const webpack = require("webpack")

environment.plugins.append("Provide", new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery',
    Popper: ['popper.js', 'default']
}))

module.exports = environment

所以也许有一个更好的地方把快捷符号放在两者都能看到的地方,但我不确定。到目前为止,application.js的条目使其全部工作。

需要注意的是,我确实找到了“expose-loader”可以帮助jquery在本地被看到的信息,但我无法使其起作用。

引用这些文章获取修复:

    null
  • https://www.botreetechnologies.com/blog/induction-jquery-in-rails-6-using-webpacker
  • https://gorails.com/forum/install-bootstrap-with-webpack-with-rails-6-beta
 类似资料:
  • 问题内容: 我试图在我自己的函数中使用jQuery ajax调用的返回值,但它始终返回未定义的值。 ajax调用绝对有效,因为当我取消注释警报时,我得到了正确的返回,并且可以在firebug中看到它。我在做蠢事吗? 问题答案: AJAX调用是异步的-这意味着AJAX请求是按常规程序执行顺序发出的,并且在您的程序中这意味着不会将数据返回警报。 您不能以这种方式使用调用的返回值,而是将利用AJAX返回

  • 问题内容: 我正在使用jQuery的网页上工作。我有一个Ajax调用,它从服务器获取数据并更新div。在该数据内部有一个jQuery函数,但是在将数据加载到页面中之后未调用该函数。我已经在页面中包含了正确的js文件。 这是从Ajax调用返回并放入div的内容: 将html插入页面后,如何使返回的javascript运行? (我将Rails与jRails插件结合使用) 问题答案: 如果要对具有htm

  • 问题内容: 我希望此函数返回ajax调用是否成功。有什么办法可以做到吗?我下面的代码无法做到这一点。 问题答案: 不幸的是,您不能将值返回给包装异步回调的函数。取而代之的是,您从AJAX请求进行的成功回调会将数据和控制权移交给另一个函数。我在下面演示了这个概念: myFunction的定义: 回调函数定义: 调用myFunction:

  • 问题内容: 我正在为网站进行股票交易所jQuery修复。 编辑:它根据返回的值更新网页上的ID / CLASS或输入值。 index.php: 目前它正在返回: 我也尝试过使用.text()将其返回到div demo.json: 请有人能告诉我我做错了什么。 提前致谢! 问题答案: 你可以这样做: 所以这里的主要问题是: 正如ajax一样,您需要执行ajax成功回调中的所有逻辑,并且始终会获得&变

  • 问题内容: 我有一些jQuery代码。我已经调用了一个Ajax函数文件file.php,其中包含一些字段,例如: 我会再次分配给jQuery函数吗?如果是这样,我该怎么办?我附上了一个示例文件: 问题答案: 该函数采用一个参数,其中包含获取的数据。因此,在您的示例中: 更多示例在jQuery文档中。

  • 问题内容: 我有一个jQuery对话框打开,然后进行AJAX调用。我想这样做,以便如果关闭对话框或按下“取消”按钮,则取消AJAX调用,并且不调用其回调函数。我可以想到一些使用变量的方式,例如: 但是,从某种程度上来说,这对我来说很肮脏,并且实际上并没有阻止AJAX调用完成。是否有内置的方式来取消正在进行的AJAX呼叫? 问题答案: 好的,因此基于使用$ .get函数返回的XmlHttpReque