保持代码DRY的方法

时间:2014-06-26 11:36:38

标签: ruby-on-rails ruby

我有一个项目创建表单,它创建了一个新项目,其中我将参数作为这3个属性的数组,我需要使用join方法转换为带有','的字符串,我是执行以下操作:

@project.trackers = @project.trackers.join(',') if !@project.trackers.nil?
@project.modules = @project.modules.join(',') if !@project.modules.nil?
@project.custom_fields = @project.custom_fields.join(',') if !@project.custom_fields.nil?
@project.repository = @project.repository.join(',') if !@project.repository.nil?   

由于我对所有变量使用相同的逻辑,我想创建一个方法,它将传递一些参数并在一行中执行此操作。

任何好的建议都会非常有帮助。

尝试:

array = ['trackers','modules','custom_fields','repository']
joiner(array) #method call

    def joiner(args)
        args.each do |param|
          if !param.nil?
            @project.param = @project.param.join(',')  
            # Stuck how to convert param string
          end  
        end  
    end

2 个答案:

答案 0 :(得分:2)

拯救的元编程:

%w(trackers modules custom_fields repository).each do |field| 
  @project.send("#{field}=", @project.send(field.to_sym).join(',')) if @project.send(field.to_sym)
end

<强>更新

如果你想像专业人士那样解决这类问题,那就有一个very good book

答案 1 :(得分:2)

%w[trackers modules custom_fields repository].each do
  |param|
  unless (a = @project.send(param)).nil?
    @project.send("#{param}=", a.join(","))
  end
end

如果您可以将值设为空字符串而不是nil,那么

%w[trackers modules custom_fields repository]
.each{|param| @project.send("#{param}=", @project.send(param).to_a.join(","))}