Rails: How to change the title of a page?

Ruby on-RailsRuby

Ruby on-Rails Problem Overview


What is the best way to create a custom title for pages in a Rails app without using a plug-in?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

In your views do something like this:

<% content_for :title, "Title for specific page" %>
<!-- or -->
<h1><%= content_for(:title, "Title for specific page") %></h1>

The following goes in the layout file:

<head>
  <title><%= yield(:title) %></title>
  <!-- Additional header tags here -->
</head>
<body>
  <!-- If all pages contain a headline tag, it's preferable to put that in the layout file too -->
  <h1><%= yield(:title) %></h1>
</body>

It's also possible to encapsulate the content_for and yield(:title) statements in helper methods (as others have already suggested). However, in simple cases such as this one I like to put the necessary code directly into the specific views without custom helpers.

Solution 2 - Ruby on-Rails

Here's a simple option that I like to use

In your layout

<head>
  <title><%= @title %></title>
</head>

And at the top of your page template (first line)

<% @title="Home" %>

Because of the way the layout and page templates are parsed the @title="Home" is evaluated before the layout is rendered.

Solution 3 - Ruby on-Rails

Best practice is to use content_for.

First, add a couple of helper methods (ie. stick in app/helpers/application_helper.rb):

def page_title(separator = " – ")
  [content_for(:title), 'My Cool Site'].compact.join(separator)
end

def page_heading(title)
  content_for(:title){ title }
  content_tag(:h1, title)
end

Then in your layout view you can simply use:

<title><%= page_title %></title>

...and in the view itself:

<%= page_heading "Awesome" %>

This way has the advantage of allowing you to shuffle where you stick the h1 tag for your title, and keeps your controller nice and free of pesky @title variables.

Solution 4 - Ruby on-Rails

An improvement on @opsb and a more complete form of @FouZ's:

In application.html.erb:

<title><%= @title || "Default Page Title" %></title>

In the view erb file or its controller:

<% @title = "Unique Page Title" %>

Solution 5 - Ruby on-Rails

Look into content_for: http://railscasts.com/episodes/8

Solution 6 - Ruby on-Rails

Without further details on the use-case or requirements that you're trying to satisfy, I can think of several alternatives:

  1. Switch the title in one of your layout pages and consume a helper method stored in application_helper.rb

    <%= custom_title %>

This approach will give you a unique title for each layout page.

  1. Railscasts suggests using a partial to load what shows up between the HEAD tags

  2. Use javascript/ajax calls to manipulate the DOM if you need to change the title after the load event.

Maybe you don't really want to change the content tagged by the title element. Perhaps you really need a breadcrumb of some sort, so that your users always know where they are with respect to your site's navigation hierarchy. While I've done fine with how the goldberg plugin, I'm sure there are other ways of pulling off the same functionality.

Solution 7 - Ruby on-Rails

I use nifty_generator's "nifty_layout" which provides with a title variable which I can call then on the page using:

<% title "Title of page" %>

I can also user <% title "Title of page", false %> to have the title just show in browser title and not in the page itself.

Solution 8 - Ruby on-Rails

This simple approach sets a default title, but also let you override it whenever you please.

In app/views/layouts/application.html.erb:

<title><%= yield(:title) || 'my default title' %></title>

And to override that default, place this in any view you like

<% content_for :title, "some new title" %>

Solution 9 - Ruby on-Rails

You can also set it in a before_filter in your controller.

# foo_controller.rb

class FooController < ApplicationController

  before_filter :set_title

  private

  def set_title
    @page_title = "Foo Page"
  end

end

# application.html.erb

<h1><%= page_title %></h1>

You can then set conditions in the set_title method to set a different titles for different actions in the controller. It's nice to be able to see all the relevant page titles within your controller.

Solution 10 - Ruby on-Rails

approach for page titling using content_for method and a partial

1 . partial name : _page_title.html.erb

<%content_for :page_title do %>
 <%=title%>
<%end%>

2 . Usage in application.html.erb inside title tag

   <title><%=yield :page_title %></title>

3 . Usage in respective *.html.erb excluding application.html.erb Just stick this in any .html.erb and supply title of the page

    e.g : inside index.html.erb

    <%=render '_page_title', title: 'title_of_page'%>

Solution 11 - Ruby on-Rails

Solution 12 - Ruby on-Rails

In short, I can write this down as follow

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>

Solution 13 - Ruby on-Rails

I like opsb's method, but this method works too.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>

Solution 14 - Ruby on-Rails

I wanted to ensure that translations was always provided for the current page.

This is what I came up with in app/views/layouts/application.html.erb:

    <title>
      <%= translate("#{controller_name}.#{action_name}.site_title", raise: true) %>
    </title>

This will always look for a translation for the current view and raise an error if none is found.

If you instead wanted a default you could do:

    <title>
      <%= translate("#{controller_name}.#{action_name}.site_title", 
          default: translate(".site_title")) %>
    </title>

Solution 15 - Ruby on-Rails

The best/clean way to do this :

<title><%= @page_title or 'Page Title' %></title>

Solution 16 - Ruby on-Rails

I would like to add my pretty simple variant.

In the ApplicationController define this method:

  def get_title
    @action_title_name || case controller_name
                            when 'djs'
                              'Djs'
                            when 'photos'
                              'Photos'
                            when 'events'
                              'Various events'
                            when 'static'
                              'Info'
                            when 'club'
                              'My club'
                            when 'news'
                              'News'
                            when 'welcome'
                              'Welcome!'
                            else
                              'Other'
                          end
  end

After that you can call get_title from your layout's title tag. You can define more specific title for your page by defining @action_title_name variable in your actions.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwusherView Question on Stackoverflow
Solution 1 - Ruby on-RailsChristoph SchiesslView Answer on Stackoverflow
Solution 2 - Ruby on-RailsopsbView Answer on Stackoverflow
Solution 3 - Ruby on-RailsAupajoView Answer on Stackoverflow
Solution 4 - Ruby on-Railsboulder_rubyView Answer on Stackoverflow
Solution 5 - Ruby on-RailsAvdiView Answer on Stackoverflow
Solution 6 - Ruby on-RailsAlanView Answer on Stackoverflow
Solution 7 - Ruby on-Railssent-hilView Answer on Stackoverflow
Solution 8 - Ruby on-RailsstevecView Answer on Stackoverflow
Solution 9 - Ruby on-RailsJasonOngView Answer on Stackoverflow
Solution 10 - Ruby on-RailsKofi AsareView Answer on Stackoverflow
Solution 11 - Ruby on-RailsHenrik NView Answer on Stackoverflow
Solution 12 - Ruby on-RailsMukesh Kumar GuptaView Answer on Stackoverflow
Solution 13 - Ruby on-RailsbarlopView Answer on Stackoverflow
Solution 14 - Ruby on-RailsEmric MånssonView Answer on Stackoverflow
Solution 15 - Ruby on-RailsFouZView Answer on Stackoverflow
Solution 16 - Ruby on-RailsIDBDView Answer on Stackoverflow