【问题标题】:Rails 3, rendering a partial for the given controller if it exists?Rails 3,如果存在,则为给定的控制器渲染一个部分?
【发布时间】:2011-03-18 02:52:41
【问题描述】:

在我的应用程序的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 块你知道吗?

各位有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我的解决方案有点不同。将其放入您的应用程序助手中:

      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
      

      【讨论】:

      • 拯救所有异常会隐藏你想知道的其他异常。这会导致难以调试的错误。考虑 rescuse ActionView::NoTemplateError 之类的东西(或者在没有模板时引发的任何错误。
      • 我喜欢点击这个链接会呈现一个很大的“未找到”消息。 :)
      • 至少在Rails 3中,异常类是ActionView::MissingTemplate
      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2011-08-28
      • 2014-01-12
      相关资源
      最近更新 更多