[英]Rails Engines rendered View
我有一个我正在开发的导轨引擎。 这是我的第一个,除了rails文档中的示例,所以我没有很好的参考什么有效。 它有一部分我要求应用程序渲染。
<%=render partial: 'my_engine/foo/bar'%>
这很好。 我理解为什么我需要通过引擎名称空间引用部分。
但在局部内,我显然也必须使用名称空间。 所以当我渲染一张照片时
<%= image_tag('my_engine/addphoto.jpg') %>
这是基于文档的反直觉。 我做错了什么,或者只是它的方式?
好的,多亏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:作为管理功能的变量:)并发现引擎中的所有本地化突然消失了。
富有,我更接近
现在来扩展我的问题,
我不确定初始化文件是否是命名空间。 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引擎只不过是荣耀的modules
和Classes
。 当你创建一个引擎(gem)时,它就像创建一个命名空间的控制器 - '
#app/controllers/namespace/controller.rb
Class Namespace::Controller < ApplicationController
...
end
你必须记住Ruby on Rails
只是一堆modules
和classes
。 显然,它已经创造了很好的 -但你必须认识到在Rails中你做的一切都涉及以某种方式某些类或模块
由于engines
只是管理这些modules
和classes
一种方式,因此您会发现Engine
只是一种增加可扩展性的方法。
module Blorgh
class Engine < Rails::Engine
...
end
end
引擎旨在使您能够在不干扰代码库的情况下向系统添加标准化功能(基本上是gems
如何工作)。 您的问题是您是否需要在路径中调用引擎的名称等:
<%= image_tag('my_engine/addphoto.jpg') %>
最重要的是, 如果您将资产与引擎捆绑在一起 ,那么Rails将如何访问这些文件? 将基于引擎的文件与其他应用程序分开意味着您将能够专门为引擎捆绑文件(它们不会发生冲突)。
这就是engines
存在的原因 - 它们允许您在不干扰应用程序的其他部分的情况下提供功能
宝石
我最近参与了一个宝石 ,我可以证明发动机的方式
rails gem基本上只是一个附加了一些其他文件的引擎。 因此,如果您将各种controllers
, models
或assets
包含在您的宝石中 - 将它们作为engine
独特之处是否有意义(以免与应用程序的其他部分发生冲突)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.