【发布时间】:2020-05-19 17:44:18
【问题描述】:
我正在尝试将一些简单的 Ajax 添加到我的 Rails 应用程序中。我正在使用带有 webpack 的 Bootstrap。
我的webpack/environment.js 文件看起来像这样
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
我的javascript/packs/application.js 看起来像这样
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
import 'bootstrap'
import 'src/main'
import 'style/main'
我正在尝试为 create.js.erb 中的一个模型添加一些 Ajax
$("#question-<%= @exam_option.exam_question.id %>-options").append("<%= escape_javascript render 'exam_option', option: @exam_option %>");
$('#add_option_modal').modal('hide');
当我尝试添加我的选项之一时,我收到控制台错误
ReferenceError: Can't find variable: $
我一直在寻找解决方案,但没有成功。
我做错了什么?谢谢!
编辑:
当我将 Bootstrap 添加到我的应用程序时,我遵循了这个 guide 。遵循指南时,我使用 yarn 安装了 bootstrap、jquery 和 popper.js
yarn add bootstrap jquery popper.js
Bootstrap 使用的 jQuery 工作正常(例如工具提示)。
根据@mechnicov 的回答,我尝试将environment.js 更改为
const webpack = require('webpack')
environment.plugins.append('Provide',
new webpack.ProvidePlugin({
$: 'jquery/src/jquery',
jQuery: 'jquery/src/jquery',
Popper: ['popper.js', 'default']
})
)
我在 import 'bootstrap' 上方添加了require("jquery") application.js
当我进行这些更改时,create.js.erb 中的代码可以正常工作,但它会使我的 Bootstrap 无法正常运行并引发诸如TypeError: ... $('[data-toggle="tooltip"]').tooltip() undefined 之类的错误。
编辑 2
根据接受的答案,我将application.js 更改为:
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
window.jQuery = window.$ = require('jquery')
import 'bootstrap'
import 'src/main'
import 'style/main'
似乎一切正常,但我不确定为什么需要以这种方式添加它? Webpack 不应该从我的environment.js 文件中执行此操作吗?
如果有人可以解释这一点,请这样做。
【问题讨论】:
-
遇到了类似的问题(下面的答案没有帮助):你把 create.js.erb 放在哪里?在 /app/javascript/pack --or-- /app/views/blabla ?我需要包含一个 javascript_pack_tag 吗?谢谢
-
通常在您正在使用的模型/控制器的视图文件夹中。您也可以通过执行类似'format.js { render'folder_name/create.js.erb}'之类的操作在不同的目录中调用它,并将“folder_name”替换为它所在的视图目录。希望有所帮助。
标签: javascript ruby-on-rails webpack