레일스 프레임워크는 애플리케이션 레이아웃를 효율적으로 지원한다. 레일스 프레임워크의 디폴트 레이아웃 파일은 app/views/layouts/application.html.erb
이다. 레일스 프로젝트를 생성한 직후 디폴트 레이아웃은 아래와 같다.
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<%= yield %>
</body>
</html>
yield 와 content_for
11번 코드라인을 눈여겨 볼 필요가 있다. 레이아웃 파일에서 파라미터 없이 yield
를 호출하면 액션 렌더링 결과 전체를 가져 오고, 파라미터와 함께 yield
를 호출할 때는 액션 렌더링 결과 중에서 해당 파라미터에 해당하는 content_for
결과를 가져오게 된다.
한편, yield
를 모델 클래스 파일에서 사용할 경우에는 순수한 루비 yield
처럼 사용하면 된다. 예를 들어 posts#show
(posts
컨트롤러의 show
액션)를 호출할 경우, show
액션 뷰 템플릿을 렌더링한 결과가 placeholder
역할을 하는 yield
위치로 삽입되는 것이다.
이번에는 페이지 타이틀을 글 제목으로 보이도록 하기 위해서 Blog
태그를 아래와 같이 변경해 볼 수 있다.
<title>
<%= content_for?(:title) ? yield(:title) : "Blog" %>
</title>
이로써 임의의 액션 렌더링 결과 중에서 :title
로 명시된 content_for
내용을 페이지 타이틀로 표시해 주게 된다. 여기서 content_for?(:title)
를 사용하여 :title
에 해당하는 content_for
블록이 있는지를 확인할 수 있다. 아래의 예, show.html.erb
뷰 템플릿 파일을 내용을 보자.
<% content_for :title %>
<% "Nicerails : " + @post.title %>
<% end %>
<h1><%= @post.title %></h1>
<%= @post.content %>
즉, show
액션이 호출될 때에만 (“Nicerails : ” + @post.title) 값을 :title
섹션에 할당해 준다. 여기서의 @post
는 show
액션 중에서 @post = Post.find(params[:id])
결과로 얻어진다.
파라메터 yield 만약 모든
posts
컨트롤러 액션의 렌더링 결과에 :title
컨텐츠를 yield
하기 위해서는 posts
컨트롤러 전용 레이아웃 파일(app/views/posts.html.erb
)을 생성하고 아래와 같이 작성한다.
<% content_for :title do %>
"Nicerails Posts"
<% end %>
<%= yield %>
<%= render template: "layouts/application" %>
주의 : 특정 컨트롤러 전용 레이아웃을 작성할 때는 반드시 파일 끝에
<%= render template: "layouts/application" %>
을 추가해 주어야 전체 애플리케이션 레이아웃이 적용된다는 것을 기억해야 한다.