Redmine插件ldap_sync测试报NoMethodError错误求助
我在Redmine上安装了ldap_sync插件,测试时出现500内部服务器错误,报错信息如下:
Completed 500 Internal Server Error in 28ms (ActiveRecord: 19.6ms)
NoMethodError (undefined method `fetch' for nil:NilClass):
涉及的核心代码片段:
def test return render 'ldap_setting_invalid' unless @ldap_setting.valid? ldap_test = params[:ldap_test] users = ldap_test.fetch(:test_users, '').split(',') groups = ldap_test.fetch(:test_groups, '').split(',') [users, groups].each {|l| l.map(&:strip).reject(&:blank?) } @test = LdapTest.new(@ldap_setting) @test.bind_user = ldap_test[:bind_user] @test.bind_password = ldap_test[:bind_password] if @test.valid? @test.run_with_users_and_groups(users, groups) else render 'ldap_test_invalid' end end
环境版本信息:
Ruby version 2.7.6-p219 (2022-04-12) [x86_64-linux]
Rails version 5.2.6.3
错误原因
报错直接指向ldap_test.fetch调用,说明params[:ldap_test]获取到的是nil——即请求中没有携带ldap_test嵌套参数,或者参数传递/解析出现异常。常见触发场景:
- 测试页面的表单字段未按要求命名为
ldap_test[test_users]、ldap_test[test_groups]这类嵌套格式 - 表单提交时数据未正确传递到后端
- 插件版本与当前Redmine/Rails版本存在兼容性问题,导致参数解析失败
解决办法
1. 检查表单参数命名
打开插件测试页面的HTML源码,确认用户、组输入框的name属性是否为ldap_test[test_users]、ldap_test[test_groups],绑定用户、密码字段同理。如果命名错误,修改对应视图文件中的字段name属性。
2. 添加nil安全处理
直接修改代码,给ldap_test设置默认空哈希,避免调用fetch时触发错误:
def test return render 'ldap_setting_invalid' unless @ldap_setting.valid? # 给ldap_test设置默认空哈希,避免nil调用fetch ldap_test = params[:ldap_test] || {} users = ldap_test.fetch(:test_users, '').split(',').map(&:strip).reject(&:blank?) groups = ldap_test.fetch(:test_groups, '').split(',').map(&:strip).reject(&:blank?) @test = LdapTest.new(@ldap_setting) # 绑定参数也添加nil安全处理 @test.bind_user = ldap_test[:bind_user] || '' @test.bind_password = ldap_test[:bind_password] || '' if @test.valid? @test.run_with_users_and_groups(users, groups) else render 'ldap_test_invalid' end end
3. 适配版本兼容性
检查插件是否有针对Ruby 2.7.x、Rails 5.2.x的适配分支,切换到对应分支重新安装插件。如果没有官方适配,可尝试用params.fetch(:ldap_test, {})替代params[:ldap_test],确保参数获取时不会返回nil。
内容的提问来源于stack exchange,提问作者kajizta

