#125 Dynamic Layouts
Discover how to dynamically change the layout using content in the database. Check out this episode for details.script/generate migration add_layout_to_blogs layout_name:string custom_layout_content:textrake db:migrategem install liquid# controllers/application.rbdef load_blog@current_blog = Blog.find_by_subdomain(current_subdomain)if @current_blog.nil? flash[:error] = "Blog invalid" redirect_to root_urlelse self.class.layout(@current_blog.layout_name || 'application')endend# config/environment.rbconfig.gem 'liquid'<!-- layouts/custom.html.erb --><%= Liquid::Template.parse(@current_blog.custom_layout_content). render('page_content' => yield, 'page_title' => yield(:title)) %><!-- blogs/_form.html.erb --><p><%= f.label :layout_name %><br /><%= f.select :layout_name, [["Standard", 'application'], ["Plain", 'plain'], ["Custom", 'custom']] %></p><p><%= f.label :custom_layout_content %><br /><%= f.text_area :custom_layout_content, :rows => 12 %></p>
UPDATE: As Pratik mentioned in the comments, the above code is not thread safe. Here is a better way to handle the layout which is thread safe.
# application.rblayout :set_layoutdef load_blog@current_blog = Blog.find_by_subdomain(current_subdomain)if @current_blog.nil? flash[:error] = "Blog invalid" redirect_to root_urlendenddef set_layout(@current_blog && @current_blog.layout_name) || 'application'end
页:
[1]