部分引用其他部分的相对路径

时间:2013-10-09 10:19:50

标签: ruby-on-rails ruby-on-rails-3 erb relative-path partial

我正在使用(主要)部分:

<%= 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' %>

但是都没有工作。

有没有办法让部分解决它使用相对路径的部分?

3 个答案:

答案 0 :(得分:3)

这可能是您问题的一种解决方案:http://apidock.com/rails/ActionController/Base/prepend_view_path

答案 1 :(得分:0)

我写了一个辅助方法来实现它。听起来像是完美的工作。

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 

答案 2 :(得分:0)

正如另一位发帖人所述,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中查找。

相关问题