Ruby on rails Rails 3,为给定的控制器渲染部分(如果存在)?

Ruby on rails Rails 3,为给定的控制器渲染部分(如果存在)?,ruby-on-rails,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呈现 所以这里的问题是,如果控制器/操

在我的应用程序的
application.html.erb
布局中,我希望有一个部分,如果给定视图中存在该部分,则进行渲染。比如说

如果访客位于
http://example.com/users/show
,我希望部分
/users/_sidebar.html.erb
呈现

但是如果访客在,比如说,
http://example.com/user/locations/san_francisco
,我希望部分
/users/locations/_sidebar.html.erb
呈现

所以这里的问题是,如果控制器/操作没有部分,它将在我的共享目录中呈现一些通用的部分,我不希望在每个视图中为块乱扔
内容


伙计们,有什么好主意吗?

肖恩·比汉(Sean Behan)在这方面有一篇很棒的帖子:

我可能会将其移动到一个帮助器,并将其稍微调整为:

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

#此方法可以使用rescue或if file exists技术。
def render_侧边栏
render(:partial=>“/#{controller.name}/sidebar”
营救
#默认侧栏
结束

我的解决方案有点不同。请在您的应用程序助手中添加以下内容:

  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\u edit\u sidebar”存在,它将呈现它,否则它将呈现一个备用的“layouts/page\u sidebar”

拯救所有异常将隐藏您想知道的其他异常。这会导致难以调试的错误。类似于
rescuse ActionView::NoTemplateError
(或者在没有模板的情况下出现任何错误。我喜欢单击此链接呈现一条大的“未找到”消息的方式。:)至少在Rails 3中,异常类是
ActionView::MissingTemplate