如何重构“共享”方法?

时间:2012-09-18 15:37:15

标签: ruby-on-rails ruby ruby-on-rails-3 methods refactoring

我正在使用Ruby on Rails 3.2.2,我想从我的模型/类中“提取”一些方法。也就是说,在多个类/模型中,我有一些方法(注意:方法与用户授权相关,并命名为“CRUD方式”),这些方法实际上是相同的;所以我认为DRY方法是将这些方法放在“共享”模块或类似的模块中。

实现这一目标的常用正确方法是什么?例如,我应该在哪里(在哪些目录和文件中)放置“共享”代码?如何在我的类/模型中包含提到的方法?你有什么建议吗?

注意:我正在寻找“Ruby on Rails创造方法”。

2 个答案:

答案 0 :(得分:8)

一种流行的方法是使用ActiveSupport问题。然后,您可以将公共逻辑放在app/concerns/app/models/concerns/目录下(根据您的偏好)。一个说明性的例子:

# app/concerns/mooable.rb
module Mooable
  extend ActiveSupport::Concern

  included do
    before_create :say_moo

    self.mooables
      where(can_moo: true)
    end
  end

  private

  def say_moo
    puts "Moo!"
  end
end

在模型中:

# app/models/cow.rb
class Cow < ActiveRecord::Base
  include Mooable
end

为了使其以这种方式工作,您必须将以下行添加到config/application.rb

config.autoload_paths += %W(#{config.root}/app/concerns)

更多信息:

答案 1 :(得分:1)

我的回答与RoR没有任何关系,但更多与Ruby有关。

Shraing公共代码可以在Ruby中以各种方式完成。在我看来,最明显的方法是创建包含代码的Ruby模块,然后将它们包含在您的类/模型中。这些共享模块经常位于应用程序根目录的lib目录下。例如:

# lib/authorizable.rb

module Authorizable
  def method1
     #some logic here
  end

  def method2
     #some more logic here
  end
end

# app/models/user.rb

 class User < ActiveRecord::Base
    include Authorizable
 end

User类现在可以调用属于Authorizable模块的method1和method2。您可以将此模块包含在您想要的任何其他Ruby类中,这样就可以干掉您的代码。