在我的应用程序的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
块丢弃每个视图?
任何想法的人?
答案 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