ruby-on-rails - 我们如何避免 Controller 中方法的重复/重复 - RAILS 3+

标签 ruby-on-rails ruby refactoring ruby-on-rails-4.2 ruby-2.2

我正在使用 ruby​​ on rails 构建一个示例电子商务应用程序。我的 Controller 名称之一是“products_controller”。这个 Controller 也作为嵌套 Controller 放在里面。这些 Controller 内的操作是相同的。我们如何表示这些 Action 无需重复代码。 代码示例如下。

app/controllers/products_controller.rb

def index
@product = Product.all
@vari = @products.variants
.............
.............
end

app/controllers/master_admins/products_controller.rb

def index
@product = Product.all
@vari = @products.variants
.............
.............
end

应用程序/ Controller /master_admins/properties_controller.rb

def product
@product = Product.all
@vari = @products.variants
.............
.............
end

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

提前致谢....

最佳答案

我建议使用 concerns这对 DRY 来说很棒。

对于controller,常用的方法可以放这里:

在我的 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

然后,通过在 Controller 中包含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

如果你有多个类使用这个类方法,你可以使用这样的东西(在 common.rb 中):

def get_details        
  if self == Product
     ## Get products
  elsif self == Variant
     ## Get variants
  elsif self == ProductDetail
     ## Get product details
  end              
end

关于ruby-on-rails - 我们如何避免 Controller 中方法的重复/重复 - RAILS 3+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29371205/

相关文章:

ruby - 在 Mechanize 中使用 JavaScript 单击链接

arrays - 为什么我不能将数字作为字符串更改为整数?

ruby - 在没有安装/运行 SMTP 服务器的情况下使用 Ruby 发送电子邮件?

Vim 中的 Ruby 重构

ruby-on-rails - Rails 使用内部 REST API

ruby-on-rails - 在哪里以及如何处理Stripe异常?

javascript - 如何将内部 setState 函数重构为静态类方法?

mysql - 如何重构这段MySQL代码?

ruby-on-rails - Rails 5 集成测试失败,出现 NoMethodError : undefined method `[]=' for nil:NilClass when using Devise helper sign_in

ruby-on-rails - Rake 因 Capistrano 部署而失败