Rails : 페이지 제목을 어떻게 바꾸나요?


160

플러그인을 사용하지 않고 Rails 앱에서 페이지에 대한 사용자 정의 제목을 만드는 가장 좋은 방법은 무엇입니까?

답변:


244

당신의 견해에서 다음과 같이하십시오 :

<% 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_forand yield(:title)문 을 캡슐화 할 수도 있습니다 (다른 사람들이 이미 제안했듯이). 그러나 이와 같은 간단한 경우에는 사용자 정의 도우미없이 필요한 코드를 특정보기에 직접 넣기를 좋아합니다.


24
이 답변을 아래 답변과 병합하여 모든 페이지에 대해 "기본 제목"을 만들었 <title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>습니다. 레이아웃과 <% content_for :title, "Conditional title" %>보기에서.
John

1
Rails 5.2.0과 완벽하게 작동합니다!
Stanimir Dimitrov

1
사용할 때 <h1><%= content_for(:title, "Title for specific page") %></h1>내 DOM에 출력되는 내용이 없습니다 (즉, <h1></h1>내용이 없음). 그러나 내 <title>Title for specific page</title>제대로 작동합니다. 어떤 아이디어?
JoshuaESummers

118

사용하고 싶은 간단한 옵션이 있습니다.

레이아웃에서

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

페이지 템플릿 상단 (첫 번째 줄)

<% @title="Home" %>

레이아웃과 페이지 템플리트가 구문 분석되는 방식으로 인해 레이아웃이 렌더링되기 전에 @ title = "Home"이 평가됩니다.


32
레일 뷰 캐싱에서는 작동하지 않습니다. rails 3에서 content_for는 캐싱에 올바르게 작동 할 정도로 똑똑합니다 (선택된 답변 참조).
opsb

4
컨트롤러 내부에 변수를 설정해서는 안됩니까?

2
@SajjadMerchant는 일반적으로 컨트롤러에 변수를 설정해야한다고 동의합니다. 이 경우 페이지 모양에 고유 한 속성을 지정하기 때문에 템플릿이 더 적합합니다. 컨트롤러 작업을 두 가지 다른 뷰에서 사용할 수도 있습니다 (이것은 매우 자주 발생하지는 않지만 제목이 특정 템플릿에 얼마나 밀접하게 바인딩되어 있는지 보여주기 위해 사용하고 있습니다).
opsb 2016 년

50

모범 사례는 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 변수가 없어야합니다.


4
값을 @content_for_title어떻게 설정 합니까?
Jordan Feldstein

@JordanFeldstein 나는 그가 무엇을 의미하는지 전혀 모른다 @content_for_title. 이어야 (content_for(:title) + ' &mdash; ' if content_for?(:title)).to_s + 'My Cool Site'합니다. 그런 다음 당신의 관점에서 그것을 설정하십시오<% content_for :title, 'My Page Title' %>
Tobias J

1
@content_for_titlecontent_for이 주석이 작성된 시점에서 를 사용할 때 발생했던 상황 입니다. 나는 이것이 더 이상 사실이 아니라고 생각하지만 최근에 보지 않았다. Toby J의 의견은 오늘의 Rails에 맞습니다. 원래 답변을 업데이트하겠습니다.
Aupajo

20

@opsb 및보다 완전한 @FouZ 형식 개선 :

에서 application.html.erb:

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

erb 파일 또는 해당 컨트롤러에서 :

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


6

만족시키려는 사용 사례 또는 요구 사항에 대한 자세한 내용없이 몇 가지 대안을 생각할 수 있습니다.

1) 레이아웃 페이지 중 하나에서 제목을 전환하고 저장된 도우미 메소드를 사용하십시오. application_helper.rb

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

이 방법은 각 레이아웃 페이지에 고유 한 제목을 제공합니다.

2) Railscasts는 HEAD 태그 사이에 표시되는 부분을로드하기 위해 부분을 사용하도록 제안합니다.

3) load 이벤트 후에 제목을 변경해야하는 경우 javascript / ajax 호출을 사용하여 DOM을 조작하십시오.

title요소로 태그가 지정된 컨텐츠를 변경하고 싶지 않을 수도 있습니다 . 아마도 사용자는 사이트 탐색 계층과 관련하여 사용자가 항상 어디에 있는지 알 수 있도록 일종의 사이트 이동 경로가 필요할 수 있습니다. goldberg plugin이 어떻게 작동하는지 잘 알고 있지만 동일한 기능을 수행하는 다른 방법이있을 것입니다.


3

나는 다음을 사용하여 페이지에서 호출 할 수있는 제목 변수를 제공하는 nifty_generator의 "nifty_layout"을 사용합니다.

<% title "Title of page" %>

또한 사용자 <% title "Title of page", false %>는 제목이 페이지 자체가 아닌 브라우저 제목에만 표시되도록 할 수 있습니다 .


2

컨트롤러의 before_filter에서 설정할 수도 있습니다.

# 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 메소드 에서 조건 을 설정하여 컨트롤러에서 다른 조치에 대해 다른 제목을 설정할 수 있습니다 . 컨트롤러 내에서 모든 관련 페이지 제목을 볼 수있는 것이 좋습니다.


2
이 방법을 사용하는 것은 (불행히도) 일반적인 관행이지만 페이지 제목을 컨트롤러에 넣는 것은 좋지 않습니다. 페이지 제목은보기와 더 관련이 있습니다. 예를 들어 XML 대체보기를 제공하려는 경우 페이지 제목과 어떤 관련이 있습니까?
Aupajo

예, 좋은 생각은 아니지만 복잡한 조건에서 다른 페이지 제목을 만들어야하는 경우에 유용 할 수있는 대안입니까?
JasonOng

1
흠, 나는 여전히 그것이보기의 조력자라고 생각합니다. 내 규칙은 XML 버전을보고 해당 변수가 필요한지 여부를 확인하는 것입니다. 그렇지 않은 경우 개별 뷰에 필요한 것입니다. 컨트롤러를 최대한 가볍게 만드십시오.
Aupajo


0

content_for 메소드와 부분을 사용하여 페이지 제목을 지정하는 방법

1 . 부분 이름 : _page_title.html.erb

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

2. 제목 태그 내의 application.html.erb 사용법

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

삼 . application.html.erb를 제외한 각각의 * .html.erb에서의 사용법 .html.erb에 붙이고 페이지 제목을 입력하십시오.

    e.g : inside index.html.erb

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

0

요컨대, 나는 이것을 다음과 같이 적을 수 있습니다

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

0

나는 opsb의 방법을 좋아하지만이 방법도 효과적입니다.

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

여기에있는 방법은 hartl 's book 3 장에서 사용 된 방법입니다.이 책은 조금 번거롭지 만 어쨌든 찾아내는 것이 좋습니다.
barlop

-1

가장 좋은 / 깨끗한 방법 :

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

-9

아주 간단한 변형을 추가하고 싶습니다.

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 변수를 정의하여 페이지에보다 구체적인 제목을 정의 할 수 있습니다.


1
지난 6 년간 우려분리 개념을 배웠지 만,이 답변이 왜 부정적인 점수를 받았는지에 대해 혼란 스러울 수있는 다른 사람들을 위해 그 개념을 제시 할 것입니다.
nurettin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.