今天,我在使用Rails 3编写可安装引擎时发现了一个非常奇怪的问题。 我的引擎中有以下ApplicationController:
module Marketplace
class ApplicationController < ::ApplicationController
before_filter :merge_abilities
layout 'marketplace/application'
def marketplace_current_user
Marketplace::User.find(current_user.id)
end
private
def merge_abilities
current_ability.merge(Ability.new(current_user))
end
end
end
我的用户模型定义是
module Marketplace
class User < ::User
devise omniauth_providers: [:facebook, :paypal]
has_one :payout_identity, class_name: "Marketplace::PayoutIdentity"
has_many :course_purchases, class_name: "Marketplace::CoursePurchase"
def has_verified_payout_identity?
self.payout_identity and self.payout_identity.receiver_id
end
end
end
启动rails服务器后,第一个加载页面的请求将使控制器正确运行marketplace_current_user
方法并加载引擎的User类。但是,在第一个请求之后的任何请求都会给出一个奇怪的NameError - “未初始化的常量Marketplace :: Marketplace :: User”。
我尝试删除marketplace_current_user
定义中的命名空间,但它会加载主应用程序的User类。
最后,当我将ApplicationController更改为如下所示:
class Marketplace::ApplicationController < ::ApplicationController
before_filter :merge_abilities
layout 'marketplace/application'
def marketplace_current_user
Marketplace::User.find(current_user.id)
end
private
def merge_abilities
current_ability.merge(Ability.new(current_user))
end
end
一切都会好起来的。
有人可以告诉我一开始我弄错了吗?以这种方式做继承是不对的吗?