如何配置Rails引擎加载顺序以实现Partial重写?
调整Rails引擎视图查找优先级以重写Partial
核心思路
要让Admin引擎的视图资源被优先匹配,就得在Admin引擎的初始化逻辑里,把它的视图路径插到Wysiwyg引擎视图路径的前面——这样render解析partial时,会先找Admin里的自定义文件,找不到才会用Wysiwyg的原始文件。
具体操作步骤
1. 修改Admin引擎的初始化文件
找到Admin引擎的lib/admin/engine.rb(路径可能根据你的引擎结构略有变动),添加如下代码:
module Admin class Engine < ::Rails::Engine isolate_namespace Admin # 启动时调整视图查找路径优先级 initializer 'admin.override_wysiwyg_partials' do |app| # 取出Wysiwyg引擎的有效视图路径 wysiwyg_view_paths = Wysiwyg::Engine.paths["app/views"].existent # 取出Admin引擎的有效视图路径 admin_view_paths = Admin::Engine.paths["app/views"].existent # 先把Wysiwyg的路径从全局视图路径里移除 app.config.paths["app/views"].delete_if { |path| wysiwyg_view_paths.include?(path) } # 先插Admin的路径,再插Wysiwyg的,确保Admin优先级更高 admin_view_paths.each { |path| app.config.paths["app/views"].unshift(path) } wysiwyg_view_paths.each { |path| app.config.paths["app/views"].unshift(path) } end end end
2. 验证路径顺序(可选)
启动Rails控制台,输入以下命令确认路径顺序:
Rails.application.config.paths["app/views"]
输出的数组里,Admin引擎的app/views路径应该排在Wysiwyg引擎的路径前面。
3. 创建自定义Partial
在Admin引擎的app/views目录下,复刻Wysiwyg引擎目标partial的完整路径结构。比如Wysiwyg的partial是app/views/wysiwyg/editor/_toolbar.html.erb,那就在Admin引擎里建app/views/wysiwyg/editor/_toolbar.html.erb,写入自定义内容即可。
关键说明
- 引擎的
initializer会在Rails启动时执行,保证路径调整在视图查找前完成。 - 用
unshift而不是push,是因为ActionView会从数组前到后依次查找视图文件,前面的路径优先级更高。 - 必须保证自定义partial的路径和Wysiwyg的完全一致,不然Rails还是会找到原始文件。
内容的提问来源于stack exchange,提问作者Stephen Nelson
相关产品推荐
相关产品推荐

