具有相同模型名称的宿主应用程序和引擎,使用宿主应用程序的部分从引擎内部渲染宿主应用程序的模型,rails

Host app and engine with same model name, rendering host app's model from inside engine using host app's partial, rails

我有一个主机应用 unicorn,型号为 Article

我还有一个 mountable 引擎挂接到名为 blorgh 的主机应用程序中。它还有一个模型:Article。它是命名空间的,所以引擎的 Article 的 table 名称实际上是 blorgh_articles.

我想做的是:从引擎内部,我想找到所有主机应用程序的 articles 然后渲染它们。

#controllers/blorgh/articles_controller.rb
require_dependency "blorgh_application_controller"
module Blorgh
  class ArticlesController < ApplicationController
    def index
      @articles = Article.all #properly grabs all the engine's articles
      @host_app_articles = main_app.Article.all # this doesn't work and I don't know why
    end
    ...
  end
end 

然后是视图:

#views/blorgh/articles/index.html.erb
<p> Here I will render blorg's articles </p>
<%= render @articles %>

<p> Here I want to render the host app's articles </p>
<%= render main_app.@host_app_articles%>

所以有两个问题:

  1. 我似乎无法从引擎内部获取主机应用程序的 articles
  2. 即使我确实从引擎内部抓取了宿主应用的 articles,我也不知道如何使用宿主应用的部分呈现宿主应用的文章:_article.rb。在一个普通的应用程序中,我只会做 render @host_app_articles 但由于视图存在于主机应用程序中,我想我会做 render main_app.@host_app_articles 但我认为这行不通。

从引擎中抓取宿主文章:

@host_app_articles = ::Article.all  #refers to top-level namespace class

从引擎内部的视图渲染它:

<% @host_articles.each do |article| %>
  <%= render file: "/app/views/articles/_article", locals: {article: article} %>
<% end %>

为了完成,下面是部分内容在主机应用程序中的样子:

#unicorn/app/views/articles/_article.rb
<%= article.title %> <br> <%= article.text %>