Який найкращий спосіб створити спеціальний заголовок для сторінок у додатку Rails без використання додатка?
Який найкращий спосіб створити спеціальний заголовок для сторінок у додатку Rails без використання додатка?
Відповіді:
Як ви думаєте, зробіть щось подібне:
<% 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_for
та yield(:title)
твердження в допоміжні методи (як уже пропонували інші). Однак у простих випадках, таких як цей, я люблю вводити необхідний код безпосередньо у конкретні представлення без спеціальних помічників.
<h1><%= content_for(:title, "Title for specific page") %></h1>
я не бачу нічого виводу в свою DOM (тобто у мене <h1></h1>
немає вмісту в ньому). Однак моя <title>Title for specific page</title>
працює правильно. Будь-які ідеї?
Ось простий варіант, який я люблю використовувати
У вашому макеті
<head>
<title><%= @title %></title>
</head>
І вгорі шаблону сторінки (перший рядок)
<% @title="Home" %>
Через те, як проаналізовано макет та шаблони сторінок, перед тим, як викладено макет, буде оцінено @ title = "Головна".
Найкраща практика - використовувати 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.
@content_for_title
?
@content_for_title
. Повинно бути (content_for(:title) + ' — ' if content_for?(:title)).to_s + 'My Cool Site'
. Потім, щоб встановити це з вашого погляду, просто<% content_for :title, 'My Page Title' %>
@content_for_title
це те, що колись було, коли ви content_for
писали цей коментар. Я вважаю, що це вже не так, але останнім часом я не дивився. Коментар Toby J правильний для сьогоднішніх Rails. Я оновлю свою оригінальну відповідь.
Поліпшення @opsb та більш повна форма @FouZ :
В application.html.erb
:
<title><%= @title || "Default Page Title" %></title>
У файлі перегляду erb або його контролері:
<% @title = "Unique Page Title" %>
Подивіться content_for
: http://railscasts.com/episodes/8
Без додаткових подробиць щодо випадку використання або вимог, які ви намагаєтесь задовольнити, я можу придумати декілька альтернатив:
1) Перемістіть заголовок на одній із сторінок макета та скористайтеся помічником, який зберігається application_helper.rb
<title><%= custom_title %></title>
Цей підхід дасть вам унікальну назву для кожної сторінки макета.
2) Railscasts пропонує використовувати часткове для завантаження того, що відображається між тегами HEAD
3) Використовуйте виклики javascript / ajax для маніпуляції з DOM, якщо вам потрібно змінити заголовок після події завантаження.
Можливо, ви не дуже хочете змінювати вміст, позначений title
елементом. Можливо, вам справді потрібна певна сухарі, щоб ваші користувачі завжди знали, де вони знаходяться щодо ієрархії навігації вашого сайту. Хоча я добре справився з тим, як плагін Goldberg, я впевнений, що існують інші способи зняти таку ж функціональність.
Я використовую nifty_generator "nifty_layout", який забезпечує змінну заголовка, яку я можу викликати потім на сторінці, використовуючи:
<% title "Title of page" %>
Я також можу, <% title "Title of page", false %>
щоб заголовок відображався в заголовку браузера, а не на самій сторінці.
Ви також можете встановити його на попередньому фільтрі у своєму контролері.
# 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, щоб встановити різні титри для різних дій у контролері. Приємно бачити всі відповідні заголовки сторінки у вашому контролері.
я використовую цей плагінпро цих помічників Rails я написав: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
підхід до титрування сторінок за допомогою методу content_for та часткового
1. часткова назва: _page_title.html.erb
<%content_for :page_title do %>
<%=title%>
<%end%>
2. Використання в application.html.erb всередині тегу заголовка
<title><%=yield :page_title %></title>
3. Використання у відповідному * .html.erb, за винятком application.html.erb Просто вставте це у будь-який .html.erb та вкажіть назву сторінки
e.g : inside index.html.erb
<%=render '_page_title', title: 'title_of_page'%>
Коротше кажучи, я можу записати це наступним чином
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
Мені подобається метод opsb, але і цей метод працює.
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
Я хотів би додати свій досить простий варіант.
У 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 у своїх діях.
<title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>
у макеті та<% content_for :title, "Conditional title" %>
в представленнях.