【问题标题】:Is there a way to render an engine's 'super' view within the main app's overridden view?有没有办法在主应用程序的覆盖视图中呈现引擎的“超级”视图?
【发布时间】:2013-10-01 20:00:05
【问题描述】:

我正在开发一个带有控制器和视图的引擎,但我希望允许覆盖视图(这很简单,因为 Rails::Engine 允许通过自动将 app/views 从主应用程序添加到查看引擎的路径)。但是,我希望被覆盖的视图能够引用来自引擎的视图 - 例如,我想在我的应用程序中使用自定义内容“包装”引擎的视图:

# main_app/app/views/engine/template.haml

# ... custom stuff here
= render template: 'engine/template'
# ... custom stuff here

问题是,一旦我覆盖它,我就找不到引用引擎视图的方法......这可能吗?

【问题讨论】:

  • render template: "#{YourEngine::Engine.root}/engine/template" 会起作用吗?可以将它包装在一个 helper 中以喜欢 super_view,它返回引擎的视图文件路径。
  • @tihom 似乎不起作用,给我:Missing template /path/to/engine/engine/template
  • 它需要是render file: ...并且修改了文件路径,所以它代表模板文件的完整路径,可能需要添加app/views
  • 好的,这确实有效(我也在路径中添加了app/views)。不是特别友好,而是一个开始。您应该将其添加为答案而不是评论。
  • 修改了一点以单独使用文件名

标签: ruby-on-rails view ruby-on-rails-3.2 rails-engines


【解决方案1】:

尝试通过提供引擎模板文件的完整路径来渲染文件。

  # in view
  <%= engine_view {|f| render file: f} %>

  # in helper
  def engine_view(&b)
     yield eval("__FILE__.gsub(Rails.root.to_s, YourEngine::Engine.root.to_s)",b.binding) 
  end

【讨论】:

    【解决方案2】:

    tihom 的方法很好,但该块感觉不必要的 hacky(并且 rubocop 不会喜欢它)。我更喜欢这样的东西:

    ## in helper
    def render_engine_view
      render file: caller_locations.first.path.gsub(Rails.root.to_s, YourEngine::Engine.root.to_s)
    end
    
    ## in view
    # ... custom stuff here
    <%= render_engine_view %>
    # ... custom stuff here
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2012-09-27
      • 2012-03-03
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多