8

我创建了一个引擎,它提供一个 ui 组件作为单元格。相应的 gem ( criteria_operator-ui_component ) 在 lib 文件夹中几乎不包含任何代码,因为要使单元格正常运行,我必须在资产路径中工作。gem 的基本文件如下所示:

require 'criteria_operator/ui_component/engine'
require 'cells/rails'

module CriteriaOperator
  module UiComponent
    # Your code goes here...
  end
end

该引擎也不包含太多内容:

module CriteriaOperator
  module UiComponent
    class Engine < ::Rails::Engine
      require 'jquery-rails'
      require 'criteria_operator'
      isolate_namespace CriteriaOperator::UiComponent
    end
  end
end

对我来说,看起来 gem 甚至不知道单元格,但据我所知,我不允许包含 lib 文件夹之外的任何内容。此外,在项目中的虚拟应用程序中测试单元工作正常。

现在我在一个真正的 Rails 应用程序中使用这个引擎。在 gemfile 中,我包含以下内容:

gem 'criteria_operator' 
gem 'cells'       # i added these three, because `bundler list` didn't show me
gem 'cells-rails' # `cells-rails` and `cells-erb` even though they are listed
gem 'cells-erb'   # as dependencies for the engine
gem 'criteria_operator-ui_component'

我安装了路线

mount CriteriaOperator::UiComponent::Engine => '/criteria_operator-ui_component'

并尝试CriteriaOperator::UiComponent::CriteriaEditor像在虚拟应用程序中那样使用单元格。内部erb:

cell('criteria_operator/ui_component/criteria_editor', @op)

或来自代码:

include Cell::RailsExtensions::ActionController    

def whatever
  cell(CriteriaOperator::UiComponent::CriteriaEditor, @op).call()
end

错误是ActionView::Template::Error (uninitialized constant CriteriaOperator::UiComponent::CriteriaEditor)

我究竟做错了什么?使用引擎时我只是遗漏了一些东西,还是引擎本身以错误的方式实现?如果是这样,为什么虚拟应用程序可以工作?我完全被困住了,这是我第一次创建 Rails 引擎,也是我第一次使用单元格......

引擎的完整代码(包括虚拟应用程序)可以在GitHub上找到(这不应该是任何广告,以防万一有人需要更多信息)。

4

1 回答 1

0

您正在调用CriteriaOperator::UiComponent::CriteriaEditor,但该类/模块似乎不存在。

CriteriaOperator::UiComponent::Engine工作正常,因为它是在引擎本身中定义的。

我猜您的示例应用程序之所以有效,是因为它使用了基于视图的调用,比如cell('criteria_operator/ui_component/criteria_editor')可能与 javascript 一起使用?如果不将单元定义为这样的类,则不能使用“代码”版本: https ://github.com/trailblazer/cells#cell-class

于 2018-08-21T14:53:50.067 回答