私はRails 6(6.0.0.rc1)に切り替えました。これは Webpacker gemをデフォルトでJavascriptアセットにRails-UJSと共に使用します。使用したい= Rails以下の機能を備えた関数からフォームを送信するために、いくつかのモジュールでUJSを使用します。
const form = document.querySelector("form")
Rails.fire(form, "submit")
以前のRails Webpackerがインストールされたバージョンでは、Rails
参照がモジュールで「グローバルに」使用可能であるように見えましたが、Rails.fire
…を呼び出すとこれが表示されます。
ReferenceError: Rails is not defined
特定のモジュールまたはすべてのモジュールで@Rails/ujs
のRails
を利用できるようにするにはどうすればよいですか?
私の設定の下…
app/javascript/controllers/form_controller.js
import { Controller } from "stimulus"
export default class extends Controller {
// ...
submit() {
const form = this.element
Rails.fire(form, "submit")
}
// ...
}
app/javascript/controllers.js
// Load all the controllers within this directory and all subdirectories.
// Controller files must be named *_controller.js.
import { Application } from "stimulus"
import { definitionsFromContext } from "stimulus/webpack-helpers"
const application = Application.start()
const context = require.context("controllers", true, /_controller\.js$/)
application.load(definitionsFromContext(context))
app/javascript/packs/application.js
require("@Rails/ujs").start()
import "controllers"
ありがとう!
私のapp/javascript/packs/application.js
:
import Rails from '@Rails/ujs';
Rails.start();
そして、私が書いているどんなモジュール、コントローラー、コンポーネントでも:
import Rails from '@Rails/ujs';
最初に、yarnを使用してRails/ujsを追加します。
yarn add @Rails/ujs
そしてconfig/webpack/environment.jsに追加します
const webpack = require('webpack')
environment.plugins.prepend('Provide',
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
Popper: ['popper.js', 'default'],
toastr: 'toastr/toastr',
ApexCharts: ['apexcharts', 'default'],
underscore: ['underscore', 'm'],
Rails: ['@Rails/ujs']
})
)
module.exports = environment
設定とロードRails js。
# pack/application.js
require("@Rails/ujs").start()
global.Rails = Rails;
私は現在6.0.0.rc2をいじっていますが、答えはわかったと思います。
したがって、以下を分離すると、
app/javascript/packs/application.js
require("@Rails/ujs").start()
import "controllers"
代わりに:
export const Rails_ujs = require("@Rails/ujs")
console.log(Rails_ujs)
Rails_ujs.start()
あなたは明らかにconsole.logを削除することができます。次に、刺激コントローラーで簡単に実行できます。
// Visit The Stimulus Handbook for more details
// https://stimulusjs.org/handbook/introduction
//
// This example controller works with specially annotated HTML like:
//
// <div data-controller="hello">
// <h1 data-target="hello.output"></h1>
// </div>
import { Controller } from "stimulus"
import { Rails_ujs } from "packs/application.js"
export default class extends Controller {
static targets = [ "output" ]
connect() {
// this.outputTarget.textContent = 'Hello, Stimulus!'
console.log('hi')
console.log(Rails_ujs)
}
}
ここで小さなテストコントローラーを使用するだけですが、console.logで取得し、Rails_ujs.fire
を呼び出すことができるので、これで十分です。
これで問題が解決するかどうかお知らせください。
それをあなたのenvironment.jsファイルに追加してください、これが私のものです(bootstrapとjqueryを使って):
const {environment} = require('@Rails/webpacker')
const webpack = require('webpack')
module.exports = environment
environment.plugins.prepend(
'Provide',
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
jquery: 'jquery',
'window.jQuery': 'jquery',
"window.$": "jquery",
Popper: ['popper.js', 'default'],
Rails: ['@Rails/ujs']
})
)
最善の方法は expose-loader
を使用して、bundle exec Rails webpacker:install:erb
を実行した場合と同じようにwebpackerを構成することだと思います。
expose-loader
をインストールします$ yarn add expose-loader
config/webpack/loaders
に構成オブジェクトをダンプします。そのフォルダが存在しない場合は作成します。config/webpack/loaders/expose.js
というファイルを作成しますこれをそのファイルに追加します。
module.exports = {
test: require.resolve('@Rails/ujs'),
use: [{
loader: 'expose-loader',
options: 'Rails'
}]
}
environment.js
に追加します次の2行をconfig/webpack/environment.js
に追加します。
const expose = require('./loaders/expose')
environment.loaders.prepend('expose', expose)
完全なファイルは次のようになります。
const { environment } = require('@Rails/webpacker')
const expose = require('./loaders/expose')
environment.loaders.prepend('expose', expose)
module.exports = environment
これにより、Rails
オブジェクトに再びグローバルにアクセスできるようになります。