Raylar: Sayfanın başlığı nasıl değiştirilir?


160

Eklenti kullanmadan Rails uygulamasındaki sayfalar için özel bir başlık oluşturmanın en iyi yolu nedir?

Yanıtlar:


244

Sizce böyle bir şey yapın:

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

Düzen dosyasında aşağıdakiler bulunur:

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

Ayrıca content_forve yield(:title)ifadelerini yardımcı yöntemlerle (diğerlerinin önerdiği gibi) kapsüllemek de mümkündür . Ancak, bu gibi basit durumlarda özel yardımcıları olmadan doğrudan belirli görünümlere gerekli kodu koymak istiyorum.


24
Her bir sayfa için "varsayılan başlık" oluşturmak üzere bu yanıtı aşağıdakiyle birleştirdim: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>düzende ve <% content_for :title, "Conditional title" %>görünümlerde.
John

1
Rails 5.2.0 ile mükemmel çalışır!
Stanimir Dimitrov

1
Kullandığımda <h1><%= content_for(:title, "Title for specific page") %></h1>DOM'uma hiçbir şey çıktı görmüyorum (yani <h1></h1>içeriğim yok). Ancak benim <title>Title for specific page</title>doğru çalışıyor. Herhangi bir fikir?
JoshuaESummers

118

İşte kullanmak istediğim basit bir seçenek

Düzeninizde

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

Ve sayfa şablonunuzun üst kısmında (ilk satır)

<% @title="Home" %>

Düzen ve sayfa şablonlarının ayrıştırılma biçimi nedeniyle, düzen oluşturulmadan önce @ title = "Ana Sayfa" değerlendirilir.


32
Bunun raylar görünümü önbelleğe alma ile çalışmadığını belirtmek gerekir. Raylarda 3 content_for, önbellekleme ile doğru şekilde çalışacak kadar akıllıdır (seçilen cevaba bakınız).
opsb

4
denetleyicinin içinde değişkenler ayarlanmamalı mı?

2
@SajjadMerchant genellikle katılıyorum, evet değişkenler denetleyicide ayarlanmalıdır. Bu durumda, sayfanın görünümüne özgü bir özellik belirttiğiniz için şablon daha uygun hissedilir. Bir denetleyici eyleminin iki farklı görünüm tarafından kullanılması da mümkündür (bu çok sık gerçekleşmez, başlığın belirli bir şablona ne kadar sıkı bağlı olduğunu göstermek için kullanıyorum).
opsb

50

En iyi yöntem content_for öğesini kullanmaktır.

İlk olarak, birkaç yardımcı yöntem ekleyin (ör. App / helpers / application_helper.rb dosyasına yapıştırma):

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

Ardından düzen görünümünüzde şunları kullanabilirsiniz:

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

... ve görünümün kendisinde:

<%= page_heading "Awesome" %>

Bu şekilde, başlığınız için h1 etiketini yapıştırdığınız yere karıştırmanıza izin verir ve denetleyicinizi hoş ve sinir bozucu @title değişkenlerinden arındırır.


4
Kişi değeri nasıl ayarlanır @content_for_title?
Jordan Feldstein

@JordanFeldstein Ne demek istediğiyle ilgili hiçbir fikrim yok @content_for_title. Olmalı (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Sonra sadece sizin görüşünüze göre ayarlamak için<% content_for :title, 'My Page Title' %>
Tobias J

1
@content_for_title eskiden ne olduğu content_for , bu yorum yazıldığı sırada olan şeydi. Bunun artık böyle olmadığına inanıyorum, ama son zamanlarda bakmadım. Toby J'nin yorumu bugünkü Rails için doğru. Orijinal cevabımı güncelleyeceğim.
Aupajo

20

Üzerinde bir iyileştirme @opsb ve daha kapsamlı bir şekilde @FouZ 'ler:

İçinde application.html.erb:

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

Görünüm erb dosyasında veya denetleyicisinde:

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


6

Kullanmaya çalıştığınız kullanım durumu veya gereksinimler hakkında daha fazla ayrıntı olmadan, birkaç alternatif düşünebilirim:

1) Düzen sayfalarınızdan birinde başlığı değiştirin ve içinde depolanan bir yardımcı yöntem kullanın application_helper.rb

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

Bu yaklaşım size her düzen sayfası için benzersiz bir başlık verecektir.

2) Railscasts, HEAD etiketleri arasında görünenleri yüklemek için kısmi kullanılmasını önerir

3) load olayından sonra başlığı değiştirmeniz gerekirse DOM'yi değiştirmek için javascript / ajax çağrılarını kullanın.

Belki de titleöğe tarafından etiketlenen içeriği gerçekten değiştirmek istemezsiniz . Belki de gerçekten bir çeşit kırıntıya ihtiyacınız vardır, böylece kullanıcılarınız her zaman sitenizin gezinme hiyerarşisine göre nerede olduklarını bilirler. Goldberg eklentisinin nasıl yapıldığına rağmen, aynı işlevselliği çıkarmanın başka yolları olduğundan eminim.


3

Ben nifty_generator'ın "nifty_layout" kullanarak daha sonra kullanarak sayfada çağırabilirsiniz bir başlık değişkeni ile kullanın:

<% title "Title of page" %>

Ayrıca, kullanıcının <% title "Title of page", false %>sayfanın kendisinde değil, yalnızca tarayıcı başlığında gösterilmesini sağlayabilirsiniz.


2

Ayrıca, denetleyicinizdeki bir before_filter öğesinde de ayarlayabilirsiniz.

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

Daha sonra , denetleyicideki farklı eylemler için farklı başlıklar ayarlamak üzere set_title yönteminde koşulları ayarlayabilirsiniz. Kumandanızdaki tüm ilgili sayfa başlıklarını görmek güzel.


2
Bu şekilde kullanmak (ne yazık ki) yaygın bir uygulamadır, ancak sayfa başlıklarını kumandanıza koymak kötü bir uygulamadır. Sayfa başlığı, görünümle daha alakalı bir şeydir. Örneğin, XML alternatif bir görünüm sunacak olsaydınız, sayfa başlığının alaka düzeyi nedir?
Aupajo

Evet, bunun iyi bir fikir olmadığını kabul ediyorum, ancak farklı sayfa başlıklarının karmaşık koşullardan doğması gereken bazı durumlarda yararlı olabilecek bir alternatif mi?
JasonOng

1
Hmm, sanırım hala manzaraya yardımcı olan bir şey. Benim kuralım XML sürümüne bakmak ve değişkene ihtiyacı olup olmadığını görmek. Değilse, bu bireysel bir görüşün ihtiyaç duyduğu bir şeydir. Denetleyicinizi mümkün olduğunca hafif hale getirin.
Aupajo


0

content_for yöntemi ve kısmi kullanarak sayfa başlıklandırma yaklaşımı

1. kısmi ad: _page_title.html.erb

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

2. Başlık etiketi içindeki application.html.erb dosyasında kullanım

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

3. Application.html.erb hariç ilgili * .html.erb içindeki kullanım.

    e.g : inside index.html.erb

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

0

Kısacası, bunu aşağıdaki gibi yazabilirim

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

0

Opsb'nin yöntemini seviyorum, ancak bu yöntem de çalışıyor.

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

FWIW burada yöntem hartl'ın kitap bölüm 3'te kullanılan yöntemdir, bu kitabı takip etmek için bir güçlük bulduğum için tavsiye etmiyorum ama her nasılsa.
barlop

-1

Bunu yapmanın en iyi / temiz yolu:

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

-9

Oldukça basit varyantımı eklemek istiyorum.

ApplicationController'da bu yöntemi tanımlayın:

  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

Bundan sonra düzeninizin başlık etiketinden get_title öğesini arayabilirsiniz. İşlemlerinizde @action_title_name değişkenini tanımlayarak sayfanız için daha spesifik bir başlık tanımlayabilirsiniz.


1
Sanırım son altı yılda endişelerin ayrılması kavramını öğrendiniz , ancak bu cevabın neden olumsuz işaretler aldığı konusunda kafanız karışmış olabilecek başkaları için ortaya koyacağım.
nurettin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.