Rails Engines渲染视图

时间:2014-05-30 00:53:11

标签: ruby-on-rails partial-views rails-engines

我有一个我正在开发的导轨引擎。这是我的第一个,除了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)实际上做了一个很好的博客,以及我bookmarked未来的演习,也许我现在需要了解它。

但是语言环境不是名称间隔,所以你需要自己做。很容易添加:engine_name到语言环境文件层次结构     阿拉德:                :ENGINE_NAME             :变量 我建议为引擎名称添加前缀,例如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

似乎工作正常

但是我们如何为模型添加方法。  我让用户添加了需要&#39; engine / user_include.rb&#39;

有一个很好的方法吗

2 个答案:

答案 0 :(得分:3)

模块&amp;类

  

我做错了什么,或者就是这样?

你做错了,但它不是“就是这样” ...让我解释它是如何运作的

Rails引擎只不过是荣耀modules&amp; Classes。当您创建引擎(gem)时,它基本上就像创建namespaced controller - '

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

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

由于engines只是一种管理这些modules&amp; classes,您会发现Engine只是一种增加可扩展性的方法。


Engines

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

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

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

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

这就是engines存在的原因 - 它们允许您提供功能而不会干扰应用程序的其他部分


<强>宝石

最近worked on a gem,我可以证明发动机的方式

rails gem基本上只是一个附加了一些其他文件的引擎。因此,如果您将各种controllersmodelsassets包含在您的宝石中,那么将它们作为engine的独特之处是不合理的(至于不冲突)与应用程序的其他部分)?

答案 1 :(得分:0)

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

此参考将帮助您更新

1。layouts and rendering

2。partial redering