Rails:ページのタイトルを変更するには?


160

プラグインを使用せずにRailsアプリでページのカスタムタイトルを作成する最良の方法は何ですか?

回答:


244

あなたの見解では次のようなことをしてください:

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

以下は、レイアウトファイルに入力します。

<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>

content_forand yield(:title)ステートメントをヘルパーメソッドにカプセル化することもできます(他の人がすでに提案しているように)。ただし、このような単純なケースでは、カスタムヘルパーなしで、必要なコードを特定のビューに直接配置します。


24
この回答を以下の回答とマージ<title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>して、レイアウトと<% content_for :title, "Conditional title" %>ビューのすべてのページに「デフォルトのタイトル」を作成しました。
ジョン

1
Rails 5.2.0で完璧に動作します!
スタニミールディミトロフ2018

1
使用する<h1><%= content_for(:title, "Title for specific page") %></h1>と、DOMに何も出力されません(つまり<h1></h1>、コンテンツがありません)。しかし、私<title>Title for specific page</title>は正しく働いています。何か案は?
JoshuaESummers

118

これが私が使いたいシンプルなオプションです

あなたのレイアウトで

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

そして、あなたのページテンプレートの一番上(最初の行)

<% @title="Home" %>

レイアウトとページテンプレートの解析方法により、レイアウトがレンダリングされる前に@ title = "Home"が評価されます。


32
これはRailsビューのキャッシュでは機能しないことに注意してください。Rails 3では、content_forは十分に賢く、キャッシングで正しく機能します(選択した回答を参照)。
opsb 2011年

4
コントローラ内で変数を設定するべきではありませんか?

2
@SajjadMerchant一般的に同意する、はい変数はコントローラで設定する必要があります。この場合は、ページの外観に固有の属性を指定しているため、テンプレートの方が適切と思われます。また、コントローラーアクションを2つの異なるビューで使用することもできます(これは非常に頻繁に発生するわけではありません。これは、タイトルが特定のテンプレートにどれだけ強くバインドされているかを示すために使用しています)。
opsb 2013年

50

ベストプラクティスはcontent_forを使用することです。

最初に、いくつかのヘルパーメソッドを追加します(つまり、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

次に、レイアウトビューで簡単に使用できます。

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

...そしてビュー自体では:

<%= page_heading "Awesome" %>

この方法には、タイトルにh1タグを付けた場所をシャッフルできるという利点があり、コントローラーをきれいに保ち、厄介な@title変数がないようにします。


4
どのように値を設定します@content_for_titleか?
ジョーダンフェルドスタイン2011

@JordanFeldstein彼が何を意味するのか私にはわかりません@content_for_title。する必要があります(content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'。次に、それをあなたの視点から設定するには、<% content_for :title, 'My Page Title' %>
Tobias J

1
@content_for_titlecontent_for、このコメントが書かれた時点でを使用していたときに起こりました。これはもう当てはまらないと思いますが、最近は見ていません。Toby Jのコメントは、今日のRailsに当てはまります。元の回答を更新します。
Aupajo 2013年

20

上の改善@opsbとのより完全な形@FouZさん:

application.html.erb

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

ビューのerbファイルまたはそのコントローラーで:

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


6

あなたが満たそうとしているユースケースや要件の詳細がなければ、私はいくつかの代替案を考えることができます:

1)レイアウトページの1つでタイトルを切り替え、次の場所に格納されているヘルパーメソッドを使用します。 application_helper.rb

<title><%= custom_title %></title>

このアプローチにより、レイアウトページごとに一意のタイトルが与えられます。

2)Railscastsは、HEADタグの間に現れるものをロードするためにパーシャルを使用することを提案します

3)ロードイベント後にタイトルを変更する必要がある場合は、javascript / ajax呼び出しを使用してDOMを操作します。

title要素でタグ付けされたコンテンツを実際に変更したくないのかもしれません。おそらく、ある種のパンくずリストが本当に必要なので、ユーザーは常に、サイトのナビゲーション階層に関してどこにいるかを知ることができます。私はgoldbergプラグインのやり方でうまくやったが、同じ機能を引き出す他の方法があると私は確信している。


3

nifty_generatorの「nifty_layout」を使用します。これは、ページで呼び出すことができるタイトル変数を提供します。

<% title "Title of page" %>

また<% title "Title of page", false %>、ページ自体ではなく、ブラウザのタイトルだけにタイトルを表示することもできます。


2

コントローラのbefore_filterで設定することもできます。

# 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>

次に、set_titleメソッドで条件を設定して、コントローラーのさまざまなアクションにさまざまなタイトルを設定できます。コントローラ内の関連するすべてのページタイトルを表示できると便利です。


2
この方法を使用することは(残念ながら)一般的な方法ですが、ページタイトルをコントローラーに配置することは悪い方法です。ページタイトルは、ビューに関連するものです。たとえば、XMLの代替ビューを提供する場合、ページタイトルにはどのような関連がありますか?
Aupajo 2008年

ええ、それはあまり良い考えではないことに同意しますが、複雑な条件から異なるページタイトルを生成する必要がある場合に役立つ代替案です。
JasonOng 2008年

1
うーん、それはまだそれがビューのヘルパーとして属しているものだと思います。私のルールは、XMLバージョンを調べて、その変数が必要かどうかを確認することです。そうでない場合は、個々のビューに必要なものです。コントローラーをできるだけ軽くします。
Aupajo


0

content_forメソッドとパーシャルを使用したページタイトルのアプローチ

1。部分的な名前:_page_title.html.erb

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

2。タイトルタグ内のapplication.html.erbでの使用

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

3。application.html.erbを除くそれぞれの* .html.erbでの使用.html.erbにこれを貼り付け、ページのタイトルを指定するだけです

    e.g : inside index.html.erb

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


0

私はopsbの方法が好きですが、この方法も機能します。

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

FWIWここでの方法は、ハートルの本の第3章で使用されている方法ではありません。
barlop

-1

これを行うための最良/クリーンな方法:

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

-9

私のかなり単純なバリアントを追加したいと思います。

ApplicationControllerでこのメソッドを定義します。

  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

その後、レイアウトのタイトルタグからget_titleを呼び出すことができます。アクションで@action_title_name変数を定義することにより、ページのより具体的なタイトルを定義できます。


1
過去6年間に懸念分離の概念を学習したと思いますが、この回答が否定的な評価を得た理由について混乱している可能性のある他の人のために説明します。
ヌレティン2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.