Rails 3,如果存在给定控制器的partial,则渲染该partial?

5
在我的应用程序的application.html.erb布局中,我希望有一个部分渲染,如果给定视图存在的话。例如,如果访问者在http://example.com/users/show,我想要渲染部分/users/_sidebar.html.erb。但是,如果访问者在http://example.com/user/locations/san_francisco,我想要渲染部分/users/locations/_sidebar.html.erb。所以问题在于,如果没有控制器/操作的部分,它将在我的共享目录中呈现一些通用的部分,而我不想在每个视图中都使用content_for块。有什么建议吗?
2个回答

4

我的解决方案有些不同。将下面的代码放入您的应用程序辅助函数中:

  def render_partial_if_exists(base_name, options={})

    file_name           = ::Rails.root.to_s+"/app/views/layouts/_#{base_name}.html.erb"
    partial_name        = "layouts/#{base_name}"
    else_file_name      = ::Rails.root.to_s+"/app/views/layouts/_#{options[:else]}.html.erb"
    else_partial_name   = "layouts/#{options[:else]}"

    if File.exists?(file_name)
      render :partial => partial_name
    elsif (options.key?(:else) and !options[:else].nil? and File.exists?(else_file_name))
        render :partial => else_partial_name
    end
  end

接下来在您的视角中:

<%= render_partial_if_exists "page_#{controller.action_name}_sidebar", :else => "page_sidebar" %>

在编辑操作中,如果存在“layouts/page_edit_sidebar”,则会呈现它,否则将呈现一个备用的“layouts/page_sidebar”。

2

Sean Behan在他的博客上详细介绍了这个问题:

http://seanbehan.com/programming/render-partial-if-file-exists/

我可能会将其移动到帮助函数中,并对其进行微调,以便:

<%= render_sidebar %>

# This method could use either the rescue or the if file exists technique.
def render_sidebar
  render(:partial => "/#{controller.name}/sidebar"
rescue
  #default side bar
end

6
捕获所有异常会隐藏其他你想知道的异常。这会导致难以调试的错误。考虑像 rescue ActionView::NoTemplateError 这样的代码(或者当没有模板时引发的任何其他错误)。 - nicholaides
1
我喜欢点击这个链接后出现一个大大的“未找到”信息。 :) - Franz
至少在Rails 3中,异常类是ActionView::MissingTemplate - Franz

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