大家晚上好!我被一个插件困住了,我真的很想得到一些建议。
问题所在
我编写了一个简单的插件,它通过添加带有一些复选框的新字段集来修改创建新项目的表单。我在插件目录中的文件中写了所有的登录。到现在为止还好。一切都很好,除了把文件发送给我的同事时,有些东西他们不喜欢。似乎他们不太喜欢修改核心文件的想法,以使工作,因为事情可能会变得一团糟,当他们更新版本的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中的钩子是什么。
这个问题简单地说
有没有办法让我的插件像现在一样工作,但不需要修改红矿山的核心文件?
发布于 2014-03-27 20:42:50
1如何修补表格。
你可以用核心的钩子。这是钩表
或者,如果您需要修补没有钩子的视图,则可以使用gem deface
。请看这个提交
2如何修补控制器。这是一个问题,因为在本例中不能使用before_filter
或alias_method_chain
-项目是在方法内部初始化的。
我认为您希望在创建(或之前)项目之后执行一些操作,并且您需要了解selected_tasks
。我的想法是遵循standart工作流并通过新的虚拟attr_writer
传递这些值来建模。
我认为你应该做的是:
attr_writer
添加到建模项目中safe_attribute
smth,如这 (我认为Redmine不允许分配不安全的属性,参见这)before_create
或after_create
回调,以通过attr_writer
处理已接受的参数。当然,这只是一个计划,我无法检查它是否有效:)
计划B
有一个新的(更简单的)想法,如何修补。可以将修补代码放置到after_filter
中,在那里您可以检查是否已成功创建@project
并处理selected_tasks
。
https://stackoverflow.com/questions/22697455
复制相似问题