Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails page titles

I don't like the way rails does page titles by default (just uses the controller name), so I'm working on a new way of doing it like so:

application controller:

def page_title
    "Default Title Here"
end

posts controller:

def page_title
    "Awesome Posts"
end

application layout:

<title><%=controller.page_title%></title>

It works well because if I don't have a page_title method in whatever controller I'm currently using it falls back to the default in the application controller. But what if in my users controller I want it to return "Signup" for the "new" action, but fall back for any other action? Is there a way to do that?

Secondly, does anyone else have any other ways of doing page titles in rails?

like image 598
tybro0103 Avatar asked Oct 01 '10 16:10

tybro0103


3 Answers

I disagree with the other answers, I believe the title shouldn't be set per action, but rather within the view itself. Keep the view logic within the view and the controller logic within the controller.

Inside your application_helper.rb add:

def title(page_title)
  content_for(:title) { page_title }
end

Then to insert it into your <title>:

<title><%= content_for?(:title) ? content_for(:title) : "Default Title" %></title>

So when you are in your views, you have access to all instance variables set from the controller and you can set it there. It keeps the clutter out of the controller as well.

<%- title "Reading #{@post.name}" %>
like image 174
Garrett Avatar answered Nov 02 '22 16:11

Garrett


I like to put a catchall, default title in my layout that can be overridden from an action by setting @title:

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

Then you can generate a title in your action:

def show
  @post = Post.find_by_id params[:id]
  @title = "tybro's blog: #{@post.title}"
end
like image 7
Raphomet Avatar answered Nov 02 '22 17:11

Raphomet


I would do this:

# Application Controller
before_filter :set_page_title

private

def set_page_title
  @page_title = "Default Title"
end

overwrite it in your other controllers

# Users Controller
before_filter :set_page_title

def new # in Users controller
  ...
  @page_title = "Sign up"
  ...
end

private

def set_page_title
  @page_title = "Users"
end

In your view:

<title><%= h @page_title %></title>
like image 3
PeterWong Avatar answered Nov 02 '22 15:11

PeterWong