我正在使用(主要)部分:
<%= render partial: 'shared/page/head' %>
它使用了其他(辅助)部分:
<head>
<%= render partial: 'shared/page/head/title' %>
<%= render partial: 'shared/page/head/meta' %>
...
<%= render partial: 'shared/page/head/fonts' %>
...
<%= render partial: 'shared/page/head/google_analytics' %>
</head>
如您所见,我当前正在为这些次要部分使用相对于
app/view
的路径,即使它们与主要部分位于同一目录中。
我尝试过使用相对路径:
<%= render partial: 'title' %>
或者
<%= render partial: './title' %>
但是都不起作用。
有没有办法使用相对路径来部分解析它使用的部分?
prepend_view_path
来实现这一点。
具体实现方法如下:
controllers/shared_page_controller.rb
class SharedPageController < ActionController::Base
before_action :set_view_paths
# ...
private
def set_view_paths
prepend_view_path 'app/views/shared/page/head'
end
end
views/shared/page/head.html.erb
<head>
<%# This will try to find the partial `views/shared/page/head/title.html.erb` %>
<%= render partial: 'title' %>
<%= render partial: 'meta' %>
<%# ... %>
<%= render partial: 'fonts' %>
<%# ... %>
<%= render partial: 'google_analytics' %>
</head>
现在 Rails 不仅会在
app/views
中查找部分内容,还会在 app/views/shared/page/head
中查找。
我为此编写了一个辅助方法,效果非常好:
def render_relative_partial(relative_path, option={})
caller_path = caller[0].split(".")[0].split("/")[0..-2].join("/")
path = caller_path.gsub("#{Rails.root.to_s}/app/views/","") + "/#{relative_path}"
option[:partial] = path
render option
end