申明:题图来源于Redmine Materials - Plugins - Redmine
说明:基于Redmine 3.4.8 redmine_materials 0.1.8/0.2.0,强烈建议在克隆的测试系统上尝试无误再修改正式业务系统。
Redmine,是一个较为大量使用的免费项目管理、Bug跟踪系统。使用起来较为简单,还可以AD/LDAP认证,以及跟代码版本库以及Testlink集成,扩展性较好。可以满足中小型企业的需求。
Redmine Materials plugin,是Redmine上一个比较有用的插件,用于项目中的物资管理,让Redmine从管人扩展到轻量级简单在管物管财(重度财物管理还是需要专业系统或收费插件)。官方介绍可以:用于设备、设备、书籍或其他物品的基本帐务管理。记录材料的使用或储存信息,而不是手工管理。
新项目使用过程中,新建物资,没有什么问题,导出也OK。但对于历史项目需要导入很多物资的情况,点击“导入物资”,发现导入结束,但是结果显示导入了0/4个物资,即代表未能导入成功。
![2a92fa5c25999efb47e4e3df23e8694d.png](https://i-blog.csdnimg.cn/blog_migrate/054ba241576478f735ea71c1efa7f6ad.png)
下面开始Debug过程:
1、第一招,查Cha水log表,找到redmine/log/production.log,可以发现导入错误信息:
su - redmine
vim redmine/log/production.log
Processing by MaterialImportsController#run as JS
Parameters: {"project_id"=>"zl-prj-test", "id"=>"131c88c7c739**********2120a1c"}
Current user: admin (id=1)
Completed 500 Internal Server Error in 12ms (ActiveRecord: 2.4ms)
ArgumentError (wrong number of arguments (given 2, expected 1)):
plugins/redmine_materials/app/models/material_kernel_import.rb:14:in `build_object'
app/models/import.rb:178:in `block in run'
app/models/import.rb:117:in `block in read_items'
app/models/import.rb:227:in `block in read_rows'
app/models/import.rb:226:in `read_rows'
app/models/import.rb:111:in `read_items'
app/models/import.rb:169:in `run'
plugins/redmine_materials/app/controllers/importer_material_controller.rb:83:in `run'
lib/redmine/sudo_mode.rb:63:in `sudo_mode'
可以看到错误的意思是:导入时执行import.rb的178/117/227行时给build_object提供了两个参数,而material_kernel_import.rb的14行build_object只接受1个传入参数。
2、找相关源码查看:
vim redmine/plugins/redmine_materials/app/models/material_kernel_import.rb
找到第14行:
def build_object(row)
material = Material.new
...
然后我们先看看import.rb的178/117/227行:
vim redmine/app/models/import.rb
#178
if object = build_object(row, item)
#117
yield row, i if block_given?
#227
yield row if block_given?
可以看到178行给build_pbject传入了两个参数row和item,而前面的build_object定义时仅接收row参数。
3、尝试解决:
估计是作者定义的时候和调用的时候思想开小差了,尝试修改build_object定义,方法是:照葫芦画瓢,照猫画虎,反正就是暴力修改试一下:
先备份:
cp redmine/plugins/redmine_materials/app/models/material_kernel_import.rb redmine/plugins/redmine_materials/app/models/material_kernel_import.rb.orig
然后修改:
vim redmine/plugins/redmine_materials/app/models/material_kernel_import.rb
修改前
def build_object(row)
material = Material.new
...
修改后:
def build_object(row, item)
material = Material.new
...
4、测试验证
首先,保险起见,执行一下重启服务的脚本(没有写脚本可以手动按顺序执行):
sh /opt/redmine/ReloadPlugins.sh
脚本如下:
#!/bin/bash
rvm 2.4.5@rails4.2
cd /opt/redmine/redmine
bundle install
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
bundle exec pumactl --state tmp/pids/puma.state restart
然后,重新登录redmine,进行物资导入。
![c4c8140f46fc9164f20b7ae277a82c76.png](https://i-blog.csdnimg.cn/blog_migrate/c5e600baa04d0112fe37fc188c7844b0.png)
这次导入结果是:4/4,即全部物资行都成功导入。
5、顺便提一下,导入过程中注意,如果导入的文字包含中文,两种方法:A、将csv用notepad打开另存为UTF-8编码格式,导入时选择编码:UTF-8;B、保持ANSI编码的csv,导入时编码选择:GB18030就可以了。物资csv导入字段映射如下图:
![5ef4dfa898d1d9f836e065a34a6218b3.png](https://i-blog.csdnimg.cn/blog_migrate/26abca274f50bf3e60c48466cc861c92.jpeg)
6、默认的Redmine主题(皮肤)比较复古,推荐几个好看的主题:Purplemine2、Minimalflat2、Redmine alex skin、A1。