Rails: Làm thế nào để thay đổi tiêu đề của một trang?


160

Cách tốt nhất để tạo tiêu đề tùy chỉnh cho các trang trong ứng dụng Rails mà không cần sử dụng trình cắm là gì?

Câu trả lời:


244

Theo quan điểm của bạn, hãy làm một cái gì đó như thế này:

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

Sau đây trong tập tin bố trí:

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

Cũng có thể gói gọn các câu lệnh content_foryield(:title)câu lệnh trong các phương thức của trình trợ giúp (như những người khác đã đề xuất). Tuy nhiên, trong các trường hợp đơn giản như trường hợp này, tôi muốn đặt mã cần thiết trực tiếp vào các chế độ xem cụ thể mà không cần người trợ giúp tùy chỉnh.


24
Tôi đã hợp nhất câu trả lời này với câu trả lời dưới đây để tạo ra "tiêu đề mặc định" cho mọi trang: <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>trong bố cục và <% content_for :title, "Conditional title" %>trong các khung nhìn.
John

1
Hoạt động hoàn hảo với Rails 5.2.0!
Stanimir Dimitrov

1
Khi tôi sử dụng, <h1><%= content_for(:title, "Title for specific page") %></h1>tôi không thấy bất cứ thứ gì xuất ra trong DOM của mình (tức là tôi <h1></h1>không có nội dung trong đó). Tuy nhiên tôi <title>Title for specific page</title>đang làm việc chính xác. Có ý kiến ​​gì không?
JoshuaESummers

118

Đây là một tùy chọn đơn giản mà tôi muốn sử dụng

Trong bố cục của bạn

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

Và ở đầu mẫu trang của bạn (dòng đầu tiên)

<% @title="Home" %>

Do cách phân tích bố cục và mẫu trang, @ title = "Trang chủ" được đánh giá trước khi bố cục được hiển thị.


32
Điều đáng chú ý là điều này sẽ không hoạt động với đường ray xem bộ nhớ đệm. Trong rails 3 content_for đủ thông minh để hoạt động chính xác với bộ nhớ đệm (xem câu trả lời được chọn).
opsb

4
các biến không nên được đặt bên trong bộ điều khiển?

2
@SajjadMerchant nói chung tôi đồng ý, các biến có nên được đặt trong bộ điều khiển. Trong trường hợp này, mẫu cảm thấy phù hợp hơn mặc dù vì bạn chỉ định một thuộc tính cụ thể cho sự xuất hiện của trang. Cũng có thể một hành động của bộ điều khiển được sử dụng bởi hai chế độ xem khác nhau (không phải điều này xảy ra rất thường xuyên, tôi đang sử dụng nó để minh họa mức độ ràng buộc chặt chẽ của tiêu đề đối với một mẫu cụ thể).
opsb

50

Thực hành tốt nhất là sử dụng content_for.

Đầu tiên, thêm một vài phương thức của trình trợ giúp (ví dụ: dính vào 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

Sau đó, trong chế độ xem bố trí của bạn, bạn có thể chỉ cần sử dụng:

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

... và theo quan điểm của chính nó:

<%= page_heading "Awesome" %>

Cách này có lợi thế là cho phép bạn xáo trộn nơi bạn gắn thẻ h1 cho tiêu đề của mình và giữ cho bộ điều khiển của bạn đẹp và không có các biến @title pesky.


4
Làm thế nào để thiết lập giá trị của @content_for_title?
Jordan Feldstein

@JordanFeldstein Tôi không biết ý anh ấy là gì @content_for_title. Nên (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'. Sau đó, để đặt nó từ chế độ xem của bạn, chỉ cần<% content_for :title, 'My Page Title' %>
Tobias J

1
@content_for_titlelà những gì đã từng xảy ra khi bạn sử dụng content_for, tại thời điểm bình luận này được viết. Tôi tin rằng đây không còn là vấn đề nữa, nhưng tôi đã không nhìn gần đây. Nhận xét của Toby J là chính xác cho Rails ngày nay. Tôi sẽ cập nhật câu trả lời ban đầu của tôi.
Aupajo

20

Một cải tiến trên @opsb và một dạng hoàn chỉnh hơn của @FouZ :

Trong application.html.erb:

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

Trong tập tin erb xem hoặc bộ điều khiển của nó:

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


6

Không có thêm thông tin chi tiết về trường hợp sử dụng hoặc các yêu cầu mà bạn đang cố gắng đáp ứng, tôi có thể nghĩ ra một số lựa chọn thay thế:

1) Chuyển tiêu đề trong một trong các trang bố cục của bạn và sử dụng phương thức trợ giúp được lưu trữ trong application_helper.rb

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

Cách tiếp cận này sẽ cung cấp cho bạn một tiêu đề duy nhất cho mỗi trang bố cục.

2) Railscasts gợi ý sử dụng một phần để tải những gì hiển thị giữa các thẻ HEAD

3) Sử dụng các lệnh gọi javascript / ajax để thao tác DOM nếu bạn cần thay đổi tiêu đề sau sự kiện tải.

Có lẽ bạn không thực sự muốn thay đổi nội dung được gắn thẻ bởi titlephần tử. Có lẽ bạn thực sự cần một mẩu bánh mì nào đó, để người dùng của bạn luôn biết họ đang ở đâu trong hệ thống phân cấp điều hướng của trang web của bạn. Mặc dù tôi đã làm rất tốt với cách plugin goldberg, tôi chắc chắn có nhiều cách khác để thực hiện chức năng tương tự.


3

Tôi sử dụng "nifty_layout" của nifty_generator, cung cấp một biến tiêu đề mà tôi có thể gọi sau đó trên trang bằng cách sử dụng:

<% title "Title of page" %>

Tôi cũng có thể người dùng <% title "Title of page", false %>có tiêu đề chỉ hiển thị trong tiêu đề trình duyệt chứ không phải trong chính trang đó.


2

Bạn cũng có thể đặt nó trong before_filter trong bộ điều khiển của bạn.

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

Sau đó, bạn có thể đặt điều kiện trong phương thức set_title để đặt tiêu đề khác nhau cho các hành động khác nhau trong bộ điều khiển. Thật tuyệt khi có thể xem tất cả các tiêu đề trang có liên quan trong bộ điều khiển của bạn.


2
Thật không may (thông thường) sử dụng cách này, nhưng thực tế không tốt khi đặt tiêu đề trang trong bộ điều khiển của bạn. Một tiêu đề trang là một cái gì đó liên quan nhiều hơn đến xem. Nếu bạn định cung cấp một chế độ xem thay thế XML chẳng hạn, tiêu đề trang có liên quan gì?
Aupajo

Vâng, tôi đồng ý rằng đó không phải là một ý tưởng hay nhưng tuy nhiên đó là một sự thay thế có thể hữu ích trong một số trường hợp các tiêu đề trang khác nhau cần được sinh ra từ các điều kiện phức tạp?
JasonOng

1
Hmm, tôi vẫn nghĩ đó là thứ gì đó thuộc về người trợ giúp cho quan điểm. Quy tắc của tôi là xem xét phiên bản XML và xem nó có cần biến đó hay không. Nếu không, đó là thứ mà một quan điểm cá nhân cần. Làm cho bộ điều khiển của bạn càng nhẹ càng tốt.
Aupajo


0

cách tiếp cận để chuẩn độ trang bằng phương thức content_for và một phần

1. tên một phần: _page_title.html.erb

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

2. Sử dụng trong application.html.erb bên trong thẻ tiêu đề

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

3. Cách sử dụng tương ứng * .html.erb không bao gồm application.html.erb Chỉ cần dán phần này vào bất kỳ .html.erb và tiêu đề cung cấp của trang

    e.g : inside index.html.erb

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

0

Tóm lại, tôi có thể viết nó xuống như sau

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

0

Tôi thích phương pháp của opsb, nhưng phương pháp này cũng hoạt động.

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

FWIW phương pháp ở đây là phương pháp được sử dụng trong cuốn sách 3 của hartl, không phải tôi khuyên bạn nên đọc cuốn sách đó vì tôi thấy nó hơi rắc rối khi làm theo nhưng dù sao đi nữa.
barlop

-1

Cách tốt nhất / sạch sẽ để làm điều này:

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

-9

Tôi muốn thêm biến thể khá đơn giản của tôi.

Trong ApplicationContoder định nghĩa phương thức này:

  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

Sau đó, bạn có thể gọi get_title từ thẻ tiêu đề của bố cục của bạn. Bạn có thể xác định tiêu đề cụ thể hơn cho trang của mình bằng cách xác định biến @action_title_name trong hành động của mình.


1
Tôi đoán bạn đã học được khái niệm phân tách mối quan tâm trong sáu năm qua, nhưng tôi sẽ chỉ đưa nó ra cho những người khác có thể bối rối về lý do tại sao câu trả lời này có dấu hiệu tiêu cực.
Nurettin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.