Rails升级后TinyMCE报错:Uncaught Error: Could not find control by type: button
我来帮你排查这个问题,这个错误通常是升级后TinyMCE的配置、资源加载或者依赖兼容性不匹配导致的,咱们一步步来解决:
1. 确保tinymce-rails gem版本匹配
首先,你需要在Gemfile里指定兼容TinyMCE 4.7.9的gem版本,旧版本的tinymce-rails可能不支持4.x系列的TinyMCE:
# Gemfile gem 'tinymce-rails', '~> 4.7.9' gem 'jquery-rails', '~> 4.3' # Rails 5.1+兼容的jQuery版本
然后运行bundle install更新依赖。
2. 修正JavaScript加载顺序
Rails 5.1+默认移除了jQuery,你已经添加了jquery-rails,但要确保加载顺序正确,application.js里的顺序应该是先加载jQuery,再加载tinymce-jquery:
// app/assets/javascripts/application.js //= require jquery //= require jquery_ujs //= require tinymce-jquery //= require_tree .
3. 移除视图中的tinymce_assets helper
<%= tinymce_assets %>是旧版本tinymce-rails的用法,在新版本中,gem已经通过asset pipeline自动处理资源加载,保留这个helper会导致重复加载或资源冲突,直接删除即可。
4. 显式配置TinyMCE初始化(适配4.x版本)
TinyMCE 4.x的默认配置和旧版本有差异,而且如果使用Turbolinks(Rails 5默认启用),需要在正确的事件中初始化编辑器。在application.js里添加以下初始化代码:
// app/assets/javascripts/application.js $(document).on('turbolinks:load', function() { $('.tinymce').tinymce({ // 显式声明需要的插件(避免默认插件缺失导致控件找不到) plugins: 'advlist autolink lists link image charmap print preview anchor', // 自定义工具栏按钮(确保按钮名称是TinyMCE 4.x支持的) toolbar: 'undo redo | bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | link image', height: 400 // 匹配你原来的rows/cols高度 }); });
如果你的项目没有使用Turbolinks,把turbolinks:load换成ready事件即可:
$(document).ready(function() { // 上面的初始化代码 });
5. 清除Asset Pipeline缓存
升级后可能存在旧的资源缓存,运行以下命令清除:
rails assets:clean # 开发环境可以不用预编译,但如果是生产环境需要运行: # rails assets:precompile
6. 检查自定义配置(如果有的话)
如果你有自定义的TinyMCE配置文件(比如app/assets/javascripts/tinymce/config.js),检查里面是否有过时的按钮名称或插件配置,比如旧版本的按钮类型在4.x中被移除或重命名,这也会导致"Could not find control by type: button"错误。
完成以上步骤后,重启Rails服务器,应该就能解决控制台错误,让TinyMCE正常工作了。
内容的提问来源于stack exchange,提问作者Zia Qamar

