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)
上面的动作包含相同的一组代码。我们如何重构它以使代码不重复。
提前致谢....
我建议使用对于 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)