Rails 引擎扩展视图,而不是覆盖

Rails engine extending views, not overriding

我知道我可以从引擎中覆盖应用程序视图,只需在引擎中创建相同的文件并将其从应用程序中删除(例如:'users/show.html.erb')。

但是,我想要的是能够扩展应用程序视图,而不是覆盖。

假设我在主应用程序的 'users/show.html.erb' 中有一个 yield

yield :foo

我想要的是让引擎指定同一个文件 'users/show.html.erb' 并有一个 content_for

content_for :foo {}

因此,将引擎视图中的一些模板数据注入到应用程序视图中。

显然,上面的方法不会起作用,因为一旦它在应用程序中找到了模板文件,它就不会在引擎中寻找模板文件。

有没有办法让它工作?

在 Rails 中无法以这种方式扩展视图。但是,您可以使用 partials 来完成此操作。在您的引擎中,编写一个局部视图文件 users/_show.html.erb,然后在您的应用程序视图中呈现它:

# app/views/users/show

# will look for a partial called "_show.html.erb" in the engine's and app's view paths.
render partial: 'show'

就像您的建议一样简单。

这个gem试图实现视图的部分扩展,但它的工作原理与我刚才描述的类似:https://github.com/amatsuda/motorhead#partially-extending-views-in-the-main-app