如何从Rails控制器中删除代码块

问题描述 投票:1回答:1

我试图从我的控制器中删除代码部分,使其看起来干净和薄。在我的一个控制器中,我必须使用许多条件,这使我的控制器看起来非常沉重。我只是想删除其他文件中的代码块,并希望将其包含在我的控制器中。 My controller code

在这里你可以看到我正在使用一些逻辑:

   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中将所有代码块放在一个文件中并在我的控制器中调用该值。

ruby-on-rails ruby refactoring block
1个回答
0
投票

为了给你一个简短的答案,所以你可以马上开始你可以做这样的事情:

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

然后你可以在一个由Rails加载的位置有RainFallSearcher(我会选择app/services

您不必在控制器或模型中拥有所有逻辑,实际上建议让它们非常精简,并创建简单(或复杂)的Ruby对象来处理逻辑。

我喜欢Rails中的一个“模式”是“服务对象”(有各种讨论和命名约定),所以谷歌,你可以获得更多信息。

这篇文章很有说服力:https://www.engineyard.com/blog/keeping-your-rails-controllers-dry-with-services

© www.soinside.com 2019 - 2024. All rights reserved.