5

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

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

注意:我正在寻找“Ruby on Rails Way to make things”。

4

2 回答 2

8

一种流行的方法是使用 ActiveSupport 关注点。然后,您通常会将通用逻辑放置在app/concerns/orapp/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)

更多信息:

于 2012-09-18T16:00:47.427 回答
1

我的回答与 RoR 没有直接关系,而与 Ruby 有更多关系。

在 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 类中,这样您就可以干燥您的代码。

于 2012-09-18T15:55:39.897 回答