在Rails可安装引擎中进行继承的正确方法

时间:2015-02-26 10:17:53

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

今天,我在使用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

一切都会好起来的。

有人可以告诉我一开始我弄错了吗?以这种方式做继承是不对的吗?

0 个答案:

没有答案