Ruby on Rails 7动作电缆
我已经从6号铁路升级到7,现在我的动作电缆频道已经不再听了。我敢肯定这是一个愚蠢的错误,但是对于我的一生,我无法追踪它。
app/javascript/channels/consumer.js
import { createConsumer } from "@rails/actioncable"
export default createConsumer()
app/javascript/channels/settings_channel.js
import consumer from "./consumer"
consumer.subscriptions.create({ channel: "SettingsChannel" })
document.addEventListener('turbo:load', () => {
//console.log(attendance_id);
consumer.subscriptions.create({ channel: "SettingsChannel"}, {
connected() {
console.log("connected to settings channel ");
},
disconnected() {
// Called when the subscription has been terminated by the server
},
received(data) {
console.log("settings channel data:");
console.log(data);
if(data.tab){
//clear other selected tabs first then highlight selected ones.
const actions_tab = document.getElementById('actions-tab');
if(actions_tab){
actions_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'actions'){
actions_tab.classList.add('settings-active-tab');
}else{
actions_tab.classList.add('settings-inactive-tab');
}
}
const committees_tab = document.getElementById('committees-tab');
if(committees_tab){
committees_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'committees'){
committees_tab.classList.add('settings-active-tab');
}else{
committees_tab.classList.add('settings-inactive-tab');
}
}
const members_tab = document.getElementById('members-tab');
if(members_tab){
members_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'members'){
members_tab.classList.add('settings-active-tab');
}else{
members_tab.classList.add('settings-inactive-tab');
}
}
const motions_tab = document.getElementById('motions-tab');
if(motions_tab){
motions_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'motions'){
motions_tab.classList.add('settings-active-tab');
}else{
motions_tab.classList.add('settings-inactive-tab');
}
}
const session_tab = document.getElementById('session-tab');
if(session_tab){
session_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'session'){
session_tab.classList.add('settings-active-tab');
}else{
session_tab.classList.add('settings-inactive-tab');
}
}
const system_tab = document.getElementById('system-tab');
if(system_tab){
system_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'system'){
system_tab.classList.add('settings-active-tab');
}else{
system_tab.classList.add('settings-inactive-tab');
}
}
}
//end of inserted code for data received
}
});
})
app/javacript/application.js
import "@hotwired/turbo-rails"
//below is not supported yet
//import "@hotwired/stimulus-importmap-autoloader"
import "./controllers"
import "@rails/actioncable"
import "@rails/activestorage"
import "./channels"
import Rails from "@rails/ujs"
window.Rails = Rails;
if(Rails.fire(document, "rails:attachBindings")){
Rails.start();
}
app/config/importmap.rb
# Pin npm packages by running ./bin/importmap
pin "application", preload: true
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
#pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
pin_all_from "app/javascript/controllers", under: "controllers"
# Use libraries available via the asset pipeline (locally or via gems). # Rails 7.0 required
pin "@rails/actioncable", to: "actioncable.esm.js"
pin "@rails/activestorage", to: "activestorage.esm.js"
提前感谢您的任何建议!我在Rails 6中的Turbolinks很好地工作了: - /
I've upgraded from Rails 6 to 7 and now my action cable channels are not listening anymore. I'm sure it's a silly mistake but for the life of me I cannot track it down.
app/javascript/channels/consumer.js
import { createConsumer } from "@rails/actioncable"
export default createConsumer()
app/javascript/channels/settings_channel.js
import consumer from "./consumer"
consumer.subscriptions.create({ channel: "SettingsChannel" })
document.addEventListener('turbo:load', () => {
//console.log(attendance_id);
consumer.subscriptions.create({ channel: "SettingsChannel"}, {
connected() {
console.log("connected to settings channel ");
},
disconnected() {
// Called when the subscription has been terminated by the server
},
received(data) {
console.log("settings channel data:");
console.log(data);
if(data.tab){
//clear other selected tabs first then highlight selected ones.
const actions_tab = document.getElementById('actions-tab');
if(actions_tab){
actions_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'actions'){
actions_tab.classList.add('settings-active-tab');
}else{
actions_tab.classList.add('settings-inactive-tab');
}
}
const committees_tab = document.getElementById('committees-tab');
if(committees_tab){
committees_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'committees'){
committees_tab.classList.add('settings-active-tab');
}else{
committees_tab.classList.add('settings-inactive-tab');
}
}
const members_tab = document.getElementById('members-tab');
if(members_tab){
members_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'members'){
members_tab.classList.add('settings-active-tab');
}else{
members_tab.classList.add('settings-inactive-tab');
}
}
const motions_tab = document.getElementById('motions-tab');
if(motions_tab){
motions_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'motions'){
motions_tab.classList.add('settings-active-tab');
}else{
motions_tab.classList.add('settings-inactive-tab');
}
}
const session_tab = document.getElementById('session-tab');
if(session_tab){
session_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'session'){
session_tab.classList.add('settings-active-tab');
}else{
session_tab.classList.add('settings-inactive-tab');
}
}
const system_tab = document.getElementById('system-tab');
if(system_tab){
system_tab.classList.remove('settings-active-tab','settings-inactive-tab');
if(data.tab == 'system'){
system_tab.classList.add('settings-active-tab');
}else{
system_tab.classList.add('settings-inactive-tab');
}
}
}
//end of inserted code for data received
}
});
})
app/javacript/application.js
import "@hotwired/turbo-rails"
//below is not supported yet
//import "@hotwired/stimulus-importmap-autoloader"
import "./controllers"
import "@rails/actioncable"
import "@rails/activestorage"
import "./channels"
import Rails from "@rails/ujs"
window.Rails = Rails;
if(Rails.fire(document, "rails:attachBindings")){
Rails.start();
}
app/config/importmap.rb
# Pin npm packages by running ./bin/importmap
pin "application", preload: true
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
#pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
pin_all_from "app/javascript/controllers", under: "controllers"
# Use libraries available via the asset pipeline (locally or via gems). # Rails 7.0 required
pin "@rails/actioncable", to: "actioncable.esm.js"
pin "@rails/activestorage", to: "activestorage.esm.js"
Thanks in advance for any advice! I had this working well with turbolinks in Rails 6 :-/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
解决了!
我的问题是在频道/index.js中,
默认情况下,Rails 7船在Channels/Index.js中使用以下代码。
此代码旨在自动导入所有 *_CHANNEL.JS文件。问题是刺激(对于频道和控制器)中不支持这一点...请参阅此线程: https://github.com/hotwired/stimulus-rails/issues/73
因此,我的解决方案是手动加载它们,直到支持自动加载为止。
这是频道/index.js中的新代码:
Solved it!
My issue was within channels/index.js
By default rails 7 ships with the following code in channels/index.js
this code is meant to automatically import all *_channel.js files. Problem is this is NOT supported in stimulus yet (for channels and controllers)...see this thread: https://github.com/hotwired/stimulus-rails/issues/73
So my solution was to load them manually until the auto loading is supported.
Here's the new code in channels/index.js: