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á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:
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_for
và yield(: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.
<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?
Đâ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ị.
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.
@content_for_title
?
@content_for_title
. Nên (content_for(:title) + ' — ' 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' %>
@content_for_title
là 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.
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" %>
Nhìn vào content_for
: http://railscasts.com/episodes/8
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 title
phầ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ự.
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 đó.
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.
tôi sử dụng plugin nàynhững người trợ giúp Rails này tôi đã viết: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
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'%>
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 %>
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>
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.
<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.