如何在rails中使用模型问题

时间:2015-06-24 08:13:21

标签: ruby-on-rails ruby separation-of-concerns aasm

我试图将模型的不同部分转移到关注点。其中两个是AASM定义的状态,以及Paperclip的附件。

因此,我将相关代码移动到单独的文件中。

应用/模型/关切/ user_aasm.rb

class User
    module UserAasm
        extend ActiveSupport::Concern
        included do
            include AASM
            aasm do
            state :unverified, initial: true
            state :approved
            state :suspended
            state :deleted
            state :banned
          end
        end
    end
end

在我的user.rb中,我做

include UserAasm

我收到以下错误:

Unable to autoload constant UserAasm, expected app/models/concerns/user_aasm.rb to define it

我想知道代码中出了什么问题。如何以正确的方式使用它?

2 个答案:

答案 0 :(得分:3)

您需要将其定义为。

require 'active_support/concern'

module UserAasm
    extend ActiveSupport::Concern
    included do
        include AASM
        aasm do
        state :unverified, initial: true
        state :approved
        state :suspended
        state :deleted
        state :banned
      end
    end
end

然后在您的User模型中

include UserAasm

这不是使模型变得模糊的正确方法,因为concerns文件夹用于放置在更多models之间共享的代码。您应该modules执行某些行为,而不是从模型中提取代码并将其放入concerns

CodeClimate

阅读本文

从这个链接引用。

'使用像这样的mixins类似于“清理”凌乱的房间,将杂乱的东西倾倒在六个独立的垃圾抽屉里并将它们关上。当然,它在表面看起来更干净,但垃圾抽屉实际上更难以识别和实现澄清领域模型所必需的分解和提取。'

答案 1 :(得分:1)

需要在课外定义模块。

所以在app/models/concerns/user_aasm.rb内:

module UserAasm
  extend ActiveSupport::Concern
  included do
    include AASM
    aasm do
    state :unverified, initial: true
    state :approved
    state :suspended
    state :deleted
    state :banned
    end
  end
end