如何从Rails Controller中删除代码块

时间:2018-09-06 06:45:03

标签: ruby-on-rails ruby refactoring block

我正在尝试从控制器中删除一个代码段,以使其看起来干净整洁。在我的一个控制器中,我必须使用许多条件,这使我的控制器看起来很沉重。我只想删除其他文件中的该代码块,并希望将其包括在我的控制器中。 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做到这一点吗?将所有代码块放在一个文件中,然后在我的控制器中调用该值。

1 个答案:

答案 0 :(得分: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中喜欢的“模式”之一是“服务对象”(有各种各样的讨论和命名约定),所以在google上您可以获取更多信息。

本文颇具解释性:https://www.engineyard.com/blog/keeping-your-rails-controllers-dry-with-services