在Redmine钩子中更改自定义字段的值

时间:2015-01-08 09:45:23

标签: ruby-on-rails redmine redmine-plugins

问题:

我的问题目前有3个自定义字段,让我们说FieldA(选择列表),FieldB(不相关)和FieldC(文本)。

需要发生的是,在保存时,FieldC采用<FieldA>-<date in Ymd>-<number from database>

的值

作为一个例子,让我们假设FieldA的值为#34; Test&#34;,今天是2015年1月8日。然后FieldC应为Test-20150108-001,其中001来自数据库中的自定义表,它是FieldA每个值的唯一值,并且每年都会重置。

我现在所做的事情:

我已经使用命令行脚本通过

生成插件
 ruby script/rails generate redmine_plugin subticket

通过

模型
ruby script/rails generate redmine_plugin_model subticket subticket_ids fa:string lastnum:integer year:integer

(其中fa是FieldA的值,lastnum是用于该值的最后一个数字,year是lastnum适用的当前年份。)

然后我继续前置init.rb添加一个钩子侦听器以实现预设钩子:

 require_dependency 'subticket_hooks'

使用以下内容创建文件lib/subticket_hooks.rb

class SubticketHooksListener < Redmine::Hook::ViewListener
  def controller_issues_edit_before_save(context={})
    issue = context[:issue]

  end
end

但是,我找不到有关如何在此处访问/写入自定义字段值的任何文档。仍然致力于使模型工作,但我认为文档很清楚,我可以进行实验(当然欢迎任何信息!)

请注意,这超出了我的能力,因为我的核心专长是完全不同的语言 - 慢慢来!

3 个答案:

答案 0 :(得分:1)

我有同样的任务

我的解决方案: 每个可自定义的redmine对象都有custom_field_values字段,该值为CustomFieldValue的数组。 CustomFieldValue包含当前值,自定义字段说明和自定义对象。

我需要读取的值并通过整理来改变。可能它不是最好的变体,但我不久前就熟悉了ruby语言。

读取自定义字段值的方法:

def object_custom_field_value(object, field_name)
  object.custom_field_values.each do |field|
    if field.custom_field.name == field_name
      return field.value
    end
  end
end

改变:

def object_custom_field_set_value(object, field_name, value)
  object.custom_field_values.each do |field|
    if field.custom_field.name == field_name
      field.value = value
    end
  end
end

希望这有帮助!

答案 1 :(得分:0)

获取: object.custom_field_value(field.id)

更新object.custom_field_values = {field.id => val}。不要忘记保存:object.save_custom_field_values。但是,它不能创造价值,因此请通过object.custom_value_for(field.id).id?

进行检查

创建/更新: 简单。只需在更新代码之前添加一行object.custom_vield_values即可。它返回值列表,并触发创建空值。例子

u = User.find(1)
cf = CustomField.where('name', 'mobile phone').first
u.custom_field_values # returns values, triggers creation
u.custom_field_values = {cf.id = "+123456789"} # set value
u.save_custom_field_values # save

文档:rubydoc

答案 2 :(得分:0)

更新名为“电子邮件”的项目自定义字段:

project = Project.find(1)
cv = CustomValue.where(customized_type: "Project", customized_id: project.id).includes(:custom_field).where(custom_fields: {type: 'ProjectCustomField', name: 'Email'}).first

cv.update value: 'email@mail.com'