我们如何避免控制器中方法的重复/重复 - RAILS 3+

Man*_*dan 2 ruby refactoring ruby-on-rails ruby-on-rails-4.2 ruby-2.2

我正在使用 ruby​​ on Rails 构建一个示例电子商务应用程序。我的控制器名称之一是“products_controller”。该控制器也作为嵌套控制器放置在内部。这些控制器内的操作是相同的。我们如何表示这些操作而不需要重复代码。下面给出了代码示例。

应用程序/控制器/products_controller.rb

def index
@product = Product.all
@vari = @products.variants
.............
.............
end
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/master_admins/products_controller.rb

def index
@product = Product.all
@vari = @products.variants
.............
.............
end
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/master_admins/properties_controller.rb

def product
@product = Product.all
@vari = @products.variants
.............
.............
end
Run Code Online (Sandbox Code Playgroud)

上面的动作包含相同的一组代码。我们如何重构它以使代码不重复。

提前致谢....

Mil*_*ind 5

我建议使用对于 DRY 来说非常棒的关注点。

对于控制器来说,常用的方法可以放在这里:

在我的 app/controllers/concerns/common.rb 中

module Common
  extend ActiveSupport::Concern

  module ClassMethods
    ## This is a Class method, call it just like you call any other class method
    def get_products_and_variants
      @product = Self.all
      @vari = @product.variants
    end
  end

## Instance method, if you don't want aclass method, use this instance method
def my_instance_method
  ## code for method
end
Run Code Online (Sandbox Code Playgroud)

然后,通过在控制器中包含 common.rb 来调用它*

include Common

def index
  ## This will make @product and @vari available
  Product.get_products_and_variants

  # ............
end



## Other method using same method call
def product
  ## This will make @product and @vari available
  Product.get_products_and_variants

  # .............
end
Run Code Online (Sandbox Code Playgroud)

如果您有多个类使用此类方法,则可以使用类似以下内容(在 中common.rb):

def get_details        
  if self == Product
     ## Get products
  elsif self == Variant
     ## Get variants
  elsif self == ProductDetail
     ## Get product details
  end              
end
Run Code Online (Sandbox Code Playgroud)