Rails 3,如果它存在,呈现给定控制器的部分?

时间:2011-03-18 02:52:41

标签: ruby-on-rails

在我的应用程序的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 个答案:

答案 0 :(得分: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”

答案 1 :(得分: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