【问题标题】:Rails 3.2 Gemified Engines: Reaching modules inside a mounted gemified engineRails 3.2 Gemified Engines:到达已安装的 gemified 引擎内的模块
【发布时间】:2012-08-23 11:23:28
【问题描述】:

我正在开发 Rails 应用程序的基础架构,并试图从某人现有的项目中获取一些东西。 我对 Rails 有点陌生,但我阅读了关于插件和引擎等的指南。

所以我有一个 gemified 引擎,包含一些模块。我有一个模型说 SharedPost 试图扩展所述模块并且我得到了未初始化的常量错误

uninitialized constant Stake::SharedPost

这是我的引擎的一些外观:

#file: lib/stake/shared_post.rb
module Stake
  module SharedPost
    ...
  end
end

#file: lib/stake/engine.rb    
module Stake
  class Engine < ::Rails::Engine
    isolate_namespace Stake

  end
end

在我的主应用程序中

#file: Gemfile
...
gem 'stake'
...

#file: config/routes.rb
Pop::Application.routes.draw do
  root :to => 'home#index'

  mount Stake::Engine, :at => '/stake'
end

#file: app/models/posted.rb
class Posted < ActiveRecord::Base
  extend Stake::SharedPost
    ...
  end
end

将加载主应用程序,但其中没有可用数据。 当我尝试运行时

rake db:seed

例如,当尝试加载 Posted 模型时,我收到错误 uninitialized constant Stake::SharedPost

我缺少什么来访问我的 gem 的命名空间模块?

编辑: 我已经阅读了acts_as 模式,这似乎不是最干净的做事方式,而且我不确定如何在我的引擎上实现它。还有其他解决方案吗?

【问题讨论】:

    标签: ruby-on-rails gem rails-engines


    【解决方案1】:

    lib/stake.rb 中是否包含lib/stake/shared_post.rb 文件?

    它应该看起来像这样:

    # file lib/stake.rb
    
    require "stake/shared_post.rb"
    
    module stake
        ....
    end
    

    【讨论】:

    • 我实际上是在发布后一段时间才发现这一点的,但我认为该帖子由于某种原因早已消失。谢谢!但是有一个问题,为什么 lib 目录中的文件不会自动被要求?这不是 rails 和\或 Gemfile 应该做的事情吗?
    • 据我所知,lib 目录中的文件确实是自动需要的——只是可能不在嵌套文件夹中。此外,隔离命名空间引擎的行为可能与普通的 Rails 应用程序有点不同?此外,如果仅自动需要所有文件,那么它们都可以从主应用程序访问 - 您可能不想公开所有文件。抱歉,这些都只是猜测 :) 这不是我广泛研究过的东西,但希望能有所帮助!
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 2013-06-16
    • 2019-10-30
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多