大家晚上好!我被一些关于我的插件的东西困住了,我真的很感激一些建议。
我写了一个简单的插件,它通过添加带有一些复选框的新字段集来修改用于创建新项目的表单。我在我的插件目录中写了我的文件中的所有登录信息。到现在为止还挺好。一切都很好,除了把文件发送给我的同事,有些东西他们不喜欢。看起来他们并不太喜欢修改核心文件以使事情正常工作的想法,因为当他们更新Redmine的版本时,事情可能会搞砸。我设法将核心文件中注入的代码减少到只有3行(3行,ikr !!),但这就是我可以去的。
projects_controller.rb
selected_tasks = params[:checkListItems].collect {|id| id.to_i}
call_hook(:add_tasks_after_project_save, { :selected_ids => selected_tasks, :project => @project})
以项目的形式 /views/projects/_form.html.erb
<%= call_hook(:append_check_list_tasks, { :project => @project }) %>
如果有一种方法可以删除我在projects_controller.rb中使用的代码并且只使用我文件中的代码,我不会感到惊讶,但我不太确定我放在form.html中的钩子
有没有办法让我的插件像现在一样工作,但无需修改Redmine的核心文件?
答案 0 :(得分:1)
1如何修补表格。
你可以使用核心的钩子。这是hook list
或者如果您需要修补没有钩子的视图,您可以使用gem deface
。请参阅此commit
2如何修补控制器。
这是一个问题,因为在这种情况下你不能使用before_filter
或alias_method_chain
- 项目在方法内初始化。
我想你想在项目创建之后(或之前)做一些动作,你需要知道selected_tasks
。我的想法是遵循标准工作流程并将这些值传递给通过新虚拟attr_writer
进行建模。
我认为你应该做的事情:
attr_writer
添加到模型项目safe_attribute
smth(我认为Redmine不允许分配未加密的属性,请参阅this)before_create
或after_create
回调以通过attr_writer
处理已接受的参数。PS当然这只是一个计划,我无法检查它是否有效:)
计划B
有一个新的(更简单的)想法如何修补。修补代码可以放在after_filter
,您可以在其中检查是否已成功创建@project
并处理selected_tasks
。