如何将自定义视图部分路径添加到Rails 4.2的查找路径?

4

我在app/views/app1/users中有一个演示的部分,类似于这个解决方案。 我已经尝试使用前置视图路径(prepend_view_path),但与上述解决方案一样,都没有成功。

haml:

#demonstration
= f.semantic_fields_for :demonstration do |ud|
  = render 'demonstration_fields', :f => ud

但是我遇到了这个错误:

Missing partial app1/_demonstration_fields, application/_demonstration_fields with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}. Searched in:

唯一的方法是传递完整路径来进行渲染,如下所示:
= render 'app1/users/demonstration_fields', :f => ud

但是这样做会违背通过prepend_view_path尝试避免冗余代码(例如指定完整路径)的目的。有没有一种方法可以避免传递完整路径?

可能是重复的问题,参考如何在Rails 3.2中预置视图路径(ActionView :: PathSet) - Brad Werth
那为什么不将演示字段移动到一个可用的路径上呢?比如共享文件夹shared/users/demonstration_fields - miler350
@miler350,在我的特定情况下,我实际上正在使用年份文件夹,例如“users_2014”,并希望按年份分段保留部分内容 - 这是一个非常具体的设置。 - Nona
尝试这行代码 [= render partial: "app1/users/demonstration_fields"] - Hemanth M C
1个回答

3
你可以重写 ActionView::ViewPaths.local_prefixes 这个私有类方法,它会被混入 Rails 中的每个控制器中。甚至在该方法上方的注释中也提到:

如果您想更改查找视图的路径前缀,请在您的控制器中重写此方法

在这个上下文中,“视图”也包括部分视图。因此,您可以将以下内容添加到 App1Controller 中:

class App1Controller < ApplicationController
  def self.local_prefixes
    [controller_path, "#{controller_path}/users"]
  end
  private_class_method :local_prefixes
end

然后,当你执行 render 'demonstration_fields', :f => ud 时,你的查找路径应该按照以下顺序:

app1/_demonstration_fields,
app1/users/_demonstration_fields,
application/_demonstration_fields`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接