Победить Cyclomatic Сложность с ActiveModel::assign_attributes в Rails

Я хочу поделиться тем, как я решил цикломатическую сложность в ROR.

Если у кого-то из вас есть другое решение или лучшая идея, пожалуйста, поделитесь, это будет хорошо.

ФОН

Я пишу систему цитат, ей нужно 10 изображений и 3 файла (dxf, skp и sh3d). Я использовал carrierwave для выполнения обработки изображений / файлов.

Теперь у меня есть этот метод (work_with_file) в моем контроллере item.rb, который используется для удаления изображений или назначения их полям.

Раньше это выглядело так:

def work_with_file(params, field)
  field_symbolized = field.to_sym
  if params[('remove_'+field).to_sym] == '1'
    send('remove_'+field+'!')
  else
    case field
      when 'isometric1'
        self.isometric1 = params[field_symbolized]
      when 'isometric2'
        self.isometric2 = params[field_symbolized]
      when 'isometric3'
        self.isometric3 = params[field_symbolized]
      when 'isometric4'
        self.isometric4 = params[field_symbolized]
      when 'photo1'
        self.photo1 = params[field_symbolized]
      when 'photo2'
        self.photo2 = params[field_symbolized]
      when 'photo3'
        self.photo3 = params[field_symbolized]
      when 'photo4'
        self.photo4 = params[field_symbolized]
      when 'floor_plan'
        self.floor_plan = params[field_symbolized]
      when 'miniature'
        self.miniature = params[field_symbolized]
      when 'dxf'
        self.dxf = params[field_symbolized]
      when 'skp'
        self.skp = params[field_symbolized]
      when 'sh3d'
        self.sh3d = params[field_symbolized]
      else
        'formato no reconocido'
    end
  end
end

Я знал, что это дело было причиной предупреждения Cyclomatic. Поэтому мне нужен был способ рефакторинга.

ПОПЫТКИ

Сначала я попытался заменить заявление дела следующим образом:

self.write_attribute field_symbolized, params[field_symbolized]

Но это не сработало. Было назначено имя файла, а не загруженный поток. Это сработало, если бы я назначал, скажем, количество для items_in_stock (items_in_stock=10)

РЕШЕНИЕ

Затем я попробовал это:

self.assign_attributes({field_symbolized => params[field_symbolized]})

И это сработало, теперь мой метод:

def trabajar_con(params, field)
  field_symbolized = field.to_sym
  if params[('remove_'+field).to_sym] == '1'
    # removes an image/file
    send('remove_'+field+'!')
  else
    # assigns a new image/file
    self.assign_attributes({field_symbolized => params[field_symbolized]})
  end
end

Я надеюсь, что вы найдете полезный совет по использованию::assign_attributes

0 ответов

Другие вопросы по тегам