我试图将模型的不同部分转移到关注点。其中两个是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
我想知道代码中出了什么问题。如何以正确的方式使用它?
答案 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
从这个链接引用。
'使用像这样的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