Hyrax 3升级至4后遇HydraEditor常量未初始化错误求助
Hyrax 3升级到Hyrax 4时
uninitialized constant HydraEditor::Form::Permissions错误排查 问题概况
- 团队将基于Hyrax的应用从3版本升级至4版本后,触发
uninitialized constant HydraEditor::Form::Permissions错误 - Gemfile已明确引入
hydra-editor ~>6.0,且执行bundle install确认gem已安装 - 仅在Docker容器内手动执行
gem install hydra-editor后,错误才会消失
相关配置文件
Dockerfile
FROM ruby:2.7.8 ENV BUNDLER_VERSION=2.4.7 ENV RAILS_VERSION=6.1.6.1 ENV FITS_VERSION=1.6.0 ENV NODE_VERSION=18 # 需与本地应用文件夹名称匹配 ENV PROJECT_PATH hyrax ENV TZ="America/New_York" USER root RUN apt-get update && apt-get -y install \ cron \ postgresql-client \ build-essential \ vim \ libreoffice \ openjdk-11-jdk # 使用JEMALLOC替代 # JEMalloc是Ruby的一种更快的垃圾回收器。 # ------------------------------------------------------------------------------------------------- RUN apt-get install -y libjemalloc2 libjemalloc-dev ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so # ImageMagic转换与FFMPEG转换 # ------------------------------------------------------------------------------------------------- RUN apt-get install -y imagemagick ghostscript ffmpeg mediainfo libgs-dev # 修改ImageMagick的安全策略,允许读写PDF文件 RUN sed -i 's/policy domain="coder" rights="none" pattern="PDF"/policy domain="coder" rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml # ------------------------------------------------------------------------------------------------- # FITS工具 # ------------------------------------------------------------------------------------------------- RUN mkdir -p /home/fits && \ cd /home/fits \ && wget https://github.com/harvard-lts/fits/releases/download/${FITS_VERSION}/fits-${FITS_VERSION}.zip -O fits.zip \ && unzip fits.zip \ && rm fits.zip \ && chmod a+x /home/fits/fits.sh ENV PATH="${PATH}:/home/fits" # Node.js环境 # ------------------------------------------------------------------------------------------------- RUN curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \ && apt-get -y install nodejs # yarn包管理工具 # ------------------------------------------------------------------------------------------------- RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -\ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get install -y yarn RUN mkdir -p /home/${PROJECT_PATH}/ WORKDIR /home/${PROJECT_PATH} ADD ./${PROJECT_PATH} /home/${PROJECT_PATH} RUN \ gem update --system --quiet && \ gem install bundler -v ${BUNDLER_VERSION} && \ bundle install --jobs=4 --retry=3
Gemfile
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.8' # Rails框架依赖 # ============================================================================== gem 'pg', '~> 1.1' gem 'puma' gem 'rails', '~> 6.1.6', '>= 6.1.6.1' gem 'webpacker' # 通过缓存减少启动时间;需在config/boot.rb中配置 gem 'bootsnap', '>= 1.4.4', require: false # 应用专属依赖 # ============================================================================== # 后台任务处理 # ===================================================== gem 'sidekiq' gem "sidekiq-cron", "~> 1.1" gem 'sidekiq-failures' # 用户认证 # ===================================================== gem 'devise' gem 'devise-guests', '~> 0.8' gem 'devise_cas_authenticatable' # 用户管理 # ===================================================== gem 'samvera-persona', git: 'https://github.com/wvulibraries/samvera-persona', branch: 'hyrax-4' gem 'sass-rails', '>= 6' gem 'jsbundling-rails' # Turbolinks可提升Web应用的导航速度,详情见:https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # 便捷构建JSON API,详情见:https://github.com/rails/jbuilder gem 'jbuilder', '~> 2.7' # 生产环境使用Redis适配器运行Action Cable gem 'redis', '~> 4.0' # https://github.com/redis/hiredis-rb gem 'hiredis' # 可选 # 用于会话存储 gem 'redis-actionpack' # 使用Active Model的has_secure_password功能 # gem 'bcrypt', '~> 3.1.7' # 使用Active Storage变体功能 # gem 'image_processing', '~> 1.2' # 健康检查工具 # ===================================================== gem 'okcomputer' # Windows系统不包含时区信息文件,因此引入tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] # Hydra生态依赖 # ===================================================== gem 'hydra-role-management' gem 'hydra-editor', '~> 6.0' # Hyrax框架依赖 # ===================================================== gem 'hyrax', '~> 4' gem 'rsolr', '>= 1.0', '< 3' gem 'bootstrap', '~> 4.0' gem 'twitter-typeahead-rails', '0.11.1.pre.corejavascript' gem 'jquery-rails' gem 'openseadragon', '>= 0.2.0' gem 'riiif', '~> 2.1' # 用于在视图中展示PDF文件的pdfjs gem 'pdfjs_viewer-rails' # Bulkrax批量导入工具 # ===================================================== gem 'bulkrax' group :development do # 在异常页面或代码中任意位置调用'console'即可访问交互式控制台 gem 'web-console', '>= 4.1.0' # 在浏览器中展示每个请求的性能信息,如SQL耗时、火焰图等 # 可配置为在生产环境使用,详情见:https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md gem 'rack-mini-profiler', '~> 2.0' gem 'listen', '~> 3.3' # Spring通过在后台保持应用运行来加速开发,详情见:https://github.com/rails/spring gem 'spring' end group :test do # 为Capybara系统测试和selenium驱动提供支持 gem 'capybara', '>= 3.26' gem 'selenium-webdriver', '>= 4.0.0.rc1' # 便捷安装和使用Web驱动来运行浏览器系统测试 gem 'webdrivers' end group :development, :test do # 在代码中任意位置调用'byebug'即可暂停执行并进入调试控制台 gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'solr_wrapper', '>= 0.3' gem 'factory_bot_rails' gem 'faker' gem 'fcrepo_wrapper' gem 'rspec-rails' end
错误截图

解决方案
1. 修正Dockerfile中的Bundler路径配置
Docker容器中bundle install可能将gem安装到非系统默认路径,导致Rails无法加载。在Dockerfile中添加路径配置,强制gem安装到项目目录:
RUN \ gem update --system --quiet && \ gem install bundler -v ${BUNDLER_VERSION} && \ bundle config set path 'vendor/bundle' && \ bundle install --jobs=4 --retry=3
2. 锁定hydra-editor具体版本
Hyrax 4对依赖版本兼容性要求严格,将Gemfile中的hydra-editor改为锁定具体版本,避免自动更新到不兼容的小版本:
gem 'hydra-editor', '6.0.0'
3. 清理Docker缓存重新构建
Docker可能缓存了旧的gem安装层,导致新的bundle install未生效。执行构建时跳过缓存:
docker build --no-cache -t your-app-image .
4. 验证容器内gem加载状态
进入容器后,确认hydra-editor的安装路径,并测试Rails是否能加载目标常量:
docker exec -it your-app-container bash # 查看gem安装路径 bundle show hydra-editor # 进入Rails控制台测试加载 rails console > HydraEditor::Form::Permissions
5. 确认Rails加载配置
检查config/boot.rb中是否存在Bundler初始化代码,确保Rails使用bundler管理的gem:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile.
内容的提问来源于stack exchange,提问作者Tracy McCormick
相关产品推荐
相关产品推荐

