Как удалить блок кода из Rails Controller - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь удалить часть кода из моего контроллера, чтобы он выглядел чистым и тонким. В одном из моих контроллеров мне приходится использовать много условий, и это заставляет мой контроллер выглядеть очень тяжелым. Я просто хочу удалить только этот блок кода в другом файле и хочу включить его в мой контроллер. Код моего контроллера

Здесь вы можете видеть, что я использую некоторую логику, такую ​​как:

   if search == 'Primary'
    if rain_fall_type == "Agriculture, Forestry and Fishing"

      if compare == "None"
        search = "None"
        rain_fall_type
      elsif compare == "All"
        rain_fall_type = compare
        data = [
          "Crops",
          "Livestock",
          "Forestry and Logging",
          "Fishing and Aquaculture",
        ]
      else
        search = "None"
        rain_fall_type = compare
      end

    elsif rain_fall_type == "None"
      rain_fall_type

      data = [
        "Primary",
      ]

    else
      data = [
        "Agriculture, Forestry and Fishing",
        "Mining and Quarrying",
      ]
    end
    ......

Я хочу, чтобы этот раздел находился в некоторых других файлах, и хочу, чтобы он назывался как есть. Я могу написать функцию и метод и возвращать значения. У меня вопрос, могу ли я вызвать этот блок кода как есть, не возвращая функцию или что-то еще. Например, мне нужно сделать что-то вроде этого:

  a = if test == "a"
       #my code
    end

   #and in my controller 

  def test
     a 
  end

Можем ли мы сделать это в ruby, поместить весь блок кода в один файл и вызвать это значение в моем контроллере.

1 Ответ

0 голосов
/ 07 сентября 2018

Чтобы дать вам короткий ответ, чтобы вы могли сразу начать, вы можете сделать что-то вроде этого:

if search == 'Primary'
  data, search = RainFallSearcher.call(rain_fall_type, compare)
end

class RainFallSearcher
  def call(rain_fall_type, compare)
    if rain_fall_type == "Agriculture, Forestry and Fishing"
      if compare == "None"
        search = "None"
        rain_fall_type
      elsif compare == "All"
        rain_fall_type = compare
        data = [
          "Crops",
          "Livestock",
          "Forestry and Logging",
          "Fishing and Aquaculture",
        ]
      else
        search = "None"
        rain_fall_type = compare
      end
    elsif rain_fall_type == "None"
      data = [
        "Primary",
      ]
    else
      data = [
        "Agriculture, Forestry and Fishing",
        "Mining and Quarrying",
      ]
    end

    return data, search
  end
end

Затем вы можете иметь RainFallSearcher в месте, загруженном Rails (я бы выбрал app/services.

Вы не обязаны иметь всю свою логику в контроллерах или моделях, на самом деле рекомендуется иметь их достаточно тонкими и создавать простые (или сложные) объекты Ruby для работы с логикой.

Один из «шаблонов», которые мне нравятся в Rails, - это «Service Object» (существуют различные обсуждения и соглашения об именах), так что Google, и вы можете получить больше информации.

Эта статья довольно объяснительная: https://www.engineyard.com/blog/keeping-your-rails-controllers-dry-with-services

...