Rails引擎呈现视图

我有一个我正在开发的导轨引擎。 这是我的第一个,除了rails文档中的示例,所以我没有很好的参考什么有效。 它有一部分我要求应用程序渲染。

 

这很好。 我理解为什么我需要通过引擎名称空间引用partial。

但在局部内,我显然也必须使用名称空间。 所以当我渲染一张照片时

   

这是基于文档的反直觉。 我做错了什么,或者只是它的方式?

好的,谢谢Rich Peck,我想我明白了。 让我列举一下,如果我仍然感到困惑,你可以纠正我。

我对如何为引擎生成命名空间感到困惑。 我假设结构生成了名称空间,当你进入引擎时,你就像在普通应用程序中一样操作。 命名空间是自动的:)。

但是如果我理解正确的话,rails组件的名称空间是通过将它们封装在由生成器处理的::::模块EngineName中生成的,但是如果你手动创建文件,那么你需要添加封装在文件中。 由于这是我的第一台发动机,我不知道他们失踪了。

对于Asset管道,命名空间由结构image / enginename / ….生成。

因此,即使在引擎内部,除非您在模块内部,否则您必须遵守命名空间EngineName :: ModelName :: Method。

命名空间不应用于任务文件,似乎不喜欢在模块中封装。 但这仍然是多余的,因为rake任务已经提供了命名空间方法。

 Ala namespace :db do 

我还惊讶地发现你需要在命名空间控制器ala中手动包含命名空间的应用程序控制器

 require_dependency "enginename/application_controller" 

但正如里奇所说,引擎只是一个美化的模块,所以我想它偶尔需要一些帮助。

当然,Javascript文件是隔离的,因为它们仅在加载引擎中的一个页面时加载,而不是在引擎的部分内容被渲染时加载。 你可以让引擎的用户在他们的application.js中包含javascript文件,但是然后他们需要手动命名,以避免将它们与其他来源的类似JS混淆。 肯尼斯·特鲁尔斯(Kenneth Truyers)有一个很好的博客,我已经为未来的练习添加了书签 ,也许我现在需要了解它。

所以语言环境不是名称间隔,所以你需要自己做。 很容易添加:engine_name到语言环境文件层次结构ala de :: engine_name:variables我建议为引擎名称添加前缀,例如x,这样就可以避免让用户使用与变量相同的名称来破坏引擎语言环境。 所以xAdmin:会比Admin更好:因为像我这样的人可能会使用Admin:作为管理function的变量:)并发现引擎中的所有本地化突然消失了。

富有,我更接近

现在来扩展我的问题,

我不确定初始化文件是否是命名空间。 apps initializers目录中的enginename.rb文件是否会覆盖引擎初始化目录中具有相同名称的文件? 我假设如果确实如此,我们可以在引擎初始化程序中使用不同的名称,因为我认为它与文件名没有真正的关联,只是簿记。

现在如何在应用程序中扩展模型。

因此,要将列添加到应用程序模型,可以在engine.rb(位于lib中)执行此操作
mattr_accessor:user_class mattr_accessor:user_table

在engine_initializer.rb中

  engine.user_class= 'User' engine.user_table='users' 

然后在迁移中

 add_column Engine.user_table.to_sym, :attribute add_index Engine.user_table.to_sym, :attribute, name: "index_#{Engine.user_table}_on_engine_attribute".to_sym 

这似乎工作正常

但是我们如何向模型添加方法。 我有用户添加require’engine / user_include.rb’

有没有一个很好的方法来做到这一点

模块和类

我做错了什么,或者只是它的方式?

你没有做错,但它不是它的方式” ……让我解释它是如何工作的

Rails引擎只不过是荣耀的modulesClasses 。 当你创建一个引擎(gem)时,它基本上就像创建一个命名空间的控制器 – ‘

 #app/controllers/namespace/controller.rb Class Namespace::Controller < ApplicationController ... end 

你必须记住Ruby on Rails只是一堆modulesclasses 。 显然它已经被很好地创建了 - 但你必须意识到你在Rails中所做的一切都以某种方式涉及某些类或模块

由于engines只是管理这些modulesclasses一种方式,因此您会发现Engine只是一种增加可扩展性的方法。


引擎

 module Blorgh class Engine < Rails::Engine ... end end 

引擎旨在使您能够在不干扰代码库的情况下向系统添加标准化function(基本上是gems如何工作)。 您的问题是您是否需要在路径中调用引擎的名称等:

 <%= image_tag('my_engine/addphoto.jpg') %> 

最重要的是, 如果您将资产与引擎捆绑在一起 ,那么Rails将如何访问这些文件? 将基于引擎的文件与其他应用程序分开意味着您将能够专门为引擎捆绑文件(它们不会发生冲突)。

这就是engines存在的原因 - 它们允许您在不干扰应用程序的其他部分的情况下提供function


gem

我最近在创作一个gem ,我可以certificate发动机的方式

rails gem基本上只是一个附加了一些其他文件的引擎。 因此,如果您将各种controllersmodelsassets包含在您的gem中 - 将它们作为engine独特之处是否有意义(以免与应用程序的其他部分发生冲突)?

您的代码将为您提供预期的输出,rails提供不同的渲染选项和标记属性。

此参考将帮助您更新

1. 布局和渲染

部分翻译