Rails: Bagaimana cara mengubah judul halaman?

160

Apa cara terbaik untuk membuat judul khusus untuk halaman di aplikasi Rails tanpa menggunakan plug-in?

lebih bijaksana
sumber

Jawaban:

244

Dalam pandangan Anda, lakukan sesuatu seperti ini:

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

Berikut ini ada dalam file tata letak:

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

Dimungkinkan juga untuk merangkum pernyataan content_fordan yield(:title)dalam metode pembantu (seperti yang telah disarankan orang lain). Namun, dalam kasus-kasus sederhana seperti ini saya suka memasukkan kode yang diperlukan langsung ke tampilan spesifik tanpa bantuan kustom.

Christoph Schiessl
sumber
24
Saya menggabungkan jawaban ini dengan yang di bawah ini untuk membuat "judul default" untuk setiap halaman: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>dalam tata letak dan <% content_for :title, "Conditional title" %>tampilan.
John
1
Bekerja sempurna dengan Rails 5.2.0!
Stanimir Dimitrov
1
Ketika saya menggunakan, <h1><%= content_for(:title, "Title for specific page") %></h1>saya tidak melihat output apa pun ke DOM saya (yaitu saya miliki <h1></h1>tanpa konten di dalamnya). Namun saya <title>Title for specific page</title>bekerja dengan benar. Ada ide?
JoshuaESummers
118

Berikut adalah opsi sederhana yang ingin saya gunakan

Dalam tata letak Anda

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

Dan di bagian atas template halaman Anda (baris pertama)

<% @title="Home" %>

Karena cara tata letak dan templat halaman diuraikan @ title = "Home" dievaluasi sebelum tata letak diberikan.

opsb
sumber
32
Perlu dicatat bahwa ini tidak akan berhasil dengan caching tampilan rail. Di rel 3 content_for cukup pintar untuk bekerja dengan benar dengan caching (lihat jawaban yang dipilih).
opsb
4
seharusnya variabel tidak diatur di dalam controller?
2
@SajjadMerchant umumnya saya setuju, variabel ya harus diatur di controller. Dalam hal ini templat terasa lebih tepat karena Anda menentukan atribut khusus untuk tampilan laman. Mungkin juga untuk tindakan pengontrol yang digunakan oleh dua pandangan yang berbeda (bukan karena hal ini sering terjadi, saya menggunakannya untuk menggambarkan seberapa terikatnya judul pada templat tertentu).
opsb
50

Praktik terbaik adalah menggunakan content_for.

Pertama, tambahkan beberapa metode pembantu (mis. Tetap di 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

Kemudian dalam tampilan tata letak Anda, Anda cukup menggunakan:

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

... dan dalam tampilan itu sendiri:

<%= page_heading "Awesome" %>

Cara ini memiliki keuntungan memungkinkan Anda untuk mengacak tempat Anda menempelkan tag h1 untuk judul Anda, dan menjaga pengontrol Anda tetap bagus dan bebas dari variabel @title sial.

Aupajo
sumber
4
Bagaimana cara menetapkan nilai @content_for_title?
Jordan Feldstein
@JordanFeldstein Saya tidak tahu apa yang dia maksud @content_for_title. Seharusnya (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Kemudian untuk mengaturnya dari pandangan Anda, cukup<% content_for :title, 'My Page Title' %>
Tobias J
1
@content_for_titleadalah apa yang biasa terjadi ketika Anda digunakan content_for, pada saat komentar ini ditulis. Saya percaya ini bukan lagi masalahnya, tetapi saya belum melihat baru-baru ini. Komentar Toby J benar untuk Rails hari ini. Saya akan memperbarui jawaban asli saya.
Aupajo
20

Peningkatan pada @opsb dan bentuk yang lebih lengkap dari @FouZ :

Di application.html.erb:

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

Dalam tampilan erb file atau pengontrolnya:

<% @title = "Unique Page Title" %>
boulder_ruby
sumber
6

Tanpa perincian lebih lanjut tentang kasus penggunaan atau persyaratan yang Anda coba penuhi, saya dapat memikirkan beberapa alternatif:

1) Ganti judul di salah satu halaman tata letak Anda dan gunakan metode pembantu yang tersimpan application_helper.rb

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

Pendekatan ini akan memberi Anda judul unik untuk setiap halaman tata letak.

2) Railscast menyarankan menggunakan sebagian untuk memuat apa yang muncul di antara tag HEAD

3) Gunakan panggilan javascript / ajax untuk memanipulasi DOM jika Anda perlu mengubah judul setelah acara pemuatan.

Mungkin Anda tidak benar-benar ingin mengubah konten yang ditandai oleh titleelemen. Mungkin Anda benar-benar membutuhkan semacam remah roti, sehingga pengguna Anda selalu tahu di mana mereka berada sehubungan dengan hierarki navigasi situs Anda. Sementara saya sudah melakukannya dengan baik dengan cara plugin goldberg, saya yakin ada cara lain untuk melakukan fungsi yang sama.

Alan
sumber
3

Saya menggunakan "nifty_layout" dari nifty_generator yang menyediakan variabel judul yang dapat saya panggil di halaman menggunakan:

<% title "Title of page" %>

Saya juga dapat pengguna <% title "Title of page", false %>agar judulnya hanya ditampilkan di judul browser dan bukan di halaman itu sendiri.

dikirim-hil
sumber
2

Anda juga bisa mengaturnya di before_filter di controller Anda.

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

Anda kemudian dapat mengatur kondisi dalam metode set_title untuk mengatur judul yang berbeda untuk tindakan yang berbeda di controller. Sangat menyenangkan bisa melihat semua judul halaman yang relevan di dalam pengontrol Anda.

JasonOng
sumber
2
Ini (sayangnya) praktik umum untuk menggunakan cara ini, tetapi praktik yang buruk untuk menempatkan judul halaman di controller Anda. Judul halaman adalah sesuatu yang lebih terkait dengan tampilan. Misalnya, jika Anda menawarkan tampilan alternatif XML, relevansi apa yang dimiliki judul halaman?
Aupajo
Ya saya setuju bahwa itu bukan ide yang cukup bagus tetapi bagaimanapun itu merupakan alternatif yang mungkin berguna dalam beberapa kasus di mana judul halaman yang berbeda perlu dilahirkan dari kondisi yang rumit?
JasonOng
1
Hmm, saya masih berpikir itu adalah sesuatu yang dimiliki sebagai penolong bagi pandangan. Aturan saya adalah melihat versi XML dan melihat apakah perlu variabel itu atau tidak. Jika tidak, itu adalah sesuatu yang dibutuhkan tampilan individual. Buat pengontrol Anda seringan mungkin.
Aupajo
0

pendekatan untuk pemberian judul halaman menggunakan metode content_for dan sebagian

1. nama parsial: _page_title.html.erb

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

2. Penggunaan di application.html.erb di dalam tag judul

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

3. Penggunaan di masing-masing * .html.erb tidak termasuk application.html.erb Cukup taruh ini di .html.erb dan berikan judul halaman

    e.g : inside index.html.erb

    <%=render '_page_title', title: 'title_of_page'%>
Kofi Asare
sumber
0

Singkatnya, saya bisa menuliskan ini sebagai berikut

<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Mukesh Kumar Gupta
sumber
0

Saya suka metode opsb, tetapi metode ini juga berfungsi.

<% provide(:title,"ttttttttttttttttttZ") %>
<html>
  <head><title><%= yield(:title) %></title></head>
   <body></body>
</html>
barlop
sumber
FWIW metode di sini adalah metode yang digunakan dalam buku hartl bab 3, bukan berarti saya merekomendasikan buku itu karena saya merasa agak merepotkan untuk menindaklanjuti tetapi bagaimanapun juga.
barlop
-1

Cara terbaik / bersih untuk melakukan ini:

<title><%= @page_title or 'Page Title' %></title>
FouZ
sumber
-9

Saya ingin menambahkan varian yang cukup sederhana.

Dalam ApplicationController, tentukan metode ini:

  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

Setelah itu Anda dapat memanggil get_title dari tag judul tata letak Anda. Anda dapat mendefinisikan judul yang lebih spesifik untuk halaman Anda dengan mendefinisikan variabel @action_title_name dalam tindakan Anda.

IDBD
sumber
1
Saya kira Anda telah mempelajari konsep pemisahan kekhawatiran selama enam tahun terakhir, tetapi saya akan menjelaskannya kepada orang lain yang mungkin bingung mengapa jawaban ini mendapat nilai negatif.
nurettin