大家好:
R队在刚开始学习redmine二次开发时遇到最常见的问题就是在接到一个需求之后找不到需要修改哪里的代码,找不到要修改哪里就比较尴尬了。。。
Redmine二次开发不同于新系统的开发,大部分需求都是对原来已有的某些功能进行优化或重新设计,此时如果对Redmine本身不够熟悉,往往容易陷入迷惑,不知道如何下手。此时,要做的第一件事就是明确要优化的功能隶属于哪个功能模块。
一. Request和Route分析
1. 整体架构描述
首先要明确的是,redmine是一个B/S系统,用户与Redmine的所有交互,都是通过“请求——响应” 的模式来进行的,也就是说,所有的功能,都必然可以定位到一个或一组的请求地址(URL)
例如,“新建问题”这个功能按钮,实际上就是对 https://127.0.0.1/redmine/projects/dataflow/issues/new 这个地址的请求
2. Route分析
当Redmine接收到请求之后,根据MVC模式,首先肯定是交由某个Controller来处理,但是至于具体是分发到哪个Controller,是由Route来决定的。
Route规则是在redmine项目目录下的 config/routes.rb 文件中配置的,具体配置语法可以参考rails帮助文档,这里只说明一下我们如何分析Route
在Redmine项目目录下输入以下命令:
bundle exec rake routes | grep -i issues/new
结果中可以看到包含了这一条:
new_issue GET /issues/new(.:format) issues#new
请求方法(GET)和路径(/issues/new)都匹配到了我们的请求,因此分发给 issues#new 进行处理,也就是issues controller 的 new action
3. log分析
在开发调试模式下,还有一种简便的方式可以快速定位到controller:通过 tail -f 查看 log/development.log文件,在页面触发一次请求,可以抓取到以下日志:
Started GET "/projects/client/issues/new" for 192.168.56.1 at 2017-12-28 15:00:07 +0800 Processing by IssuesController#new as HTML Parameters: {"project_id"=>"client"}
也表明了该请求是由 IssuesController 的 new方法来处理,同时还把请求的参数都打印出来了,方便调试
二. 代码逻辑与Response分析
def new respond_to do |format| format.html { render :action => 'new', :layout => !request.xhr? } format.js end end
到这里我们看到的是,对https://127.0.0.1/redmine/projects/dataflow/issues/new的请求,Redmine定义了respond_to 来进行响应,其中对html和js两种不同格式的请求,分别有不同的响应
具体响应的内容,可以查看 app/views/issues/new.html.erb 以及 app/views/issues/new.js.erb 文件