相关疑难解决方法(0)

Rails引擎扩展功能

我有一个定义一些模型和控制器的引擎.我希望能够在我的应用程序中扩展某些模型/控制器的功能(例如添加方法),而不会丢失引擎中的原始模型/控制器功能.在我读到的任何地方,您只需要在应用程序中定义具有相同名称的控制器,Rails将自动合并它们,但它对我不起作用,引擎中的控制器被简单地忽略(我不认为它甚至被加载).

ruby ruby-on-rails rails-engines

15
推荐指数
3
解决办法
5297
查看次数

覆盖Rails引擎控制器操作

我正在使用Rails引擎,但我需要自定义一些控制器操作.

我实际上是分叉引擎,并将这些自定义实现到我自己的fork中,但我想知道Rails引擎中是否有正式的方式来覆盖和自定义控制器.

ruby-on-rails rails-engines

14
推荐指数
2
解决办法
8014
查看次数

如何在Rails 3应用程序中获取所有引擎的列表

根据Rails引擎扩展 Rails 2.x中的功能,可以做到

Rails::Initializer.new(Rails.configuration).plugin_loader.engines
Run Code Online (Sandbox Code Playgroud)

此代码在Rails 3中不起作用

ActionController::RoutingError (undefined method `new' for Rails::Initializer:Module):
  config/application.rb:12:in `require_or_load'
Run Code Online (Sandbox Code Playgroud)

在Rails 3中我需要做些什么才能获得这样的引擎列表?

这是在主应用程序中扩展Rails 3引擎的控制器所需的

rubygems ruby-on-rails ruby-on-rails-plugins rails-engines ruby-on-rails-3

7
推荐指数
2
解决办法
2866
查看次数

从父应用程序重新打开Rails 3引擎类

现在,您不能通过/app在父应用程序的/app目录中添加相同的类来重新打开引擎目录中包含的Engine类.例如:

/my_engine/app/controllers/users_controller.rb
/my_app/app/controllers/users_controller.rb
Run Code Online (Sandbox Code Playgroud)

my_engine如果父应用程序中存在同名文件,则甚至不会加载文件.更多细节在这里:

http://www.cowboycoded.com/2011/02/28/why-you-cant-reopen-rails-3-engine-classes-from-the-parent-app/

我正在寻找一种解决方法,允许我在与父应用程序相同的路径中删除相同的文件名/类,并重新打开而不是覆盖该类.也许我错过了一些明显的东西.我能够使用一个使用class_eval的单独文件(不同的文件名)来完成这项工作,但我对这个解决方案并不满意.关于优雅解决方案的任何想法?

我也想知道这个限制背后是否有原因,或者它只是rails如何加载文件(参见包含链接)而非故意的结果.在我看来,改变引擎的加载行为以允许以这种方式重新打开类将是rails中的一个很好的特性.我知道一开始我很困惑,我相信其他开发人员也会对这个问题感到困惑.

ruby-on-rails rails-engines ruby-on-rails-3

7
推荐指数
1
解决办法
1067
查看次数

如何正确扩展 Rails Engine 的控制器?

我正在开发名为 Carrier ( https://github.com/stanislaw/carrier ) 的Rails 插件(它是 3.1 引擎)。

在我的一个 rails 应用程序中,我想用一些新方法扩展 Carrier 的控制器 - fx。将新操作 #comment_form 添加到 Carrier::MessagesController(我希望此操作仅存在于我的应用程序中 - 我不想将其添加到引擎中 - 因为它非常具体)。

我在这里看到的两种策略:

1)我将{Carrier's plugin root}/app/controllers/carrier/messages_controller.rb文件复制到我的应用程序的app/controllers/carrier/文件夹中,然后扩展它(所有插件的原始操作也被复制到rails应用程序控制器文件夹中! )。

2)我想要的更准确的方法 - 只是创建 {My rails app}/app/controllers/carrier/messages_controller.rb 并只写#comment_form 方法,我希望 Carrier 扩展。

期望两个控制器的内容(来自插件文件夹+自定义在我的 Rails 应用程序中只有新的#comment_form)会叠加,我尝试了第二种方式。但是 Rails 然后停止识别来自 Carrier 插件文件夹的 messages_controller.rb 中写入的所有原始 Carrier 操作(#index、#show 等...),并开始将 Rails 应用程序的 messages_controller.rb 版本视为唯一一个(所有原始操作都开始处理为空,因此开始通过 Rails 约定的默认流程呈现)。

所以我的一般问题是:如何将新操作添加到 Rails Engines 控制器而不将它们完全复制到 Rails app/controllers 文件夹?

UPD

现在,我看到了两种解决方案,它们允许在没有严重黑客攻击的情况下扩展引擎的控制器(就像这个 gem 所做的那样:https : //github.com/asee/mixable_engines来自这个线程:在主应用程序中扩展 Rails 3 引擎的控制器

1) 在 #{main_app}/app/controller/your_engine 文件夹中的 …

ruby-on-rails ruby-on-rails-plugins rails-engines ruby-on-rails-3.1

4
推荐指数
1
解决办法
3321
查看次数

如何在主应用程序中覆盖 rails 3 引擎模型和控制器?

我希望能够在基本应用程序中覆盖我的 rails 3 引擎的模型和控制器。

检查 $LOAD_PATH,我在那里找到了引擎的 'app/{models,controllers}',但我不能明确要求引擎的模型或控制器文件: require 'engine_name/model_name' 失败并显示“没有这样的文件”(尝试使用两个命名空间( app/controllers/enginename/*) 和普通引擎)。

那么,在 Rails 3 中扩展引擎模型/控制器而不将它们复制到基础应用程序的最佳方法是什么?


基本上,这是一个加载顺序问题。所以,如果我明确要求引擎的模型,一切都好,但我希望有更好的方法。

rails-engines ruby-on-rails-3

1
推荐指数
1
解决办法
4008
查看次数