Bucket Place/Ruby on Rails

[Ruby on Rails] CSS 적용하기

Cloud Travel 2014. 4. 29. 15:29


  들어가면서... 


 이전 페이지에 존재하는 book_list 프로젝트에 CSS를 적용해보도록 한다.


 CSS를 적용하는 방법에 알아보도록 한다. 그 전에 알아야 할 사실이 몇가지 있다.

 - 생성된 각 컨트롤러 마다 하나의  [controller_name].CSS.SCSS 파일이 생성된다.

  > SCSS 확장자는 새롭게 적용된 SCSS문법을 기존의 CSS에 대응시키도록 자동으로 변경시킨다.

  > SCSS는 추가적으로 계층적 접근법으로 CSS를 정의할 수 있게 해준다.

 - 모든 페이지는 하나의  Layout 이 겉을 감싸고 있다.

  > Layout의 위치:  app/views/layouts/application.html.erb 

 - 각 페이지마다 다른 Layout을 적용해야 하기 때문에 Layout에서 컨트롤러에 대해서 다르게 적용되게 변경해야 한다.


 아래의 순서에 맞춰서 CSS를 적용시켜보도록하자.


 

  Layout 변경 


 1. Layout파일을 연다.

> vi app/views/layouts/application.html.erb


 2. 컨텐츠를 감싸는 Body(Wrapper)에 클래스 이름을 적용시켜준다. 클래스 이름은 컨트롤러의 이름으로 해준다.

<!DOCTYPE html>
<html>
<head>
  <title>BookList</title>
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body class='<%= controller.controller_name %>'>

<%= yield %>

</body>
</html>


   View에 Class를 정의


 1. 변경할 View를 켜서 적절한 Class이름을 정의해준다. (index.html.erb 파일만 변경해보겠다.)

> vi app/views/books/index.html.erb

<h1>Listing books</h1>

<table>
  <thead class="list_header">
    <tr>
      <th>Cover</th>
      <th>Description</th>
      <th>Price</th>
      <th>Action</th>
    </tr>
  </thead>

  <tbody>
    <% @books.each do |book| %>
      <tr class="<%= cycle('list_line_odd', 'list_line_even') %>">
        <td><%= image_tag(book.image_url, class: 'list_image') %></td>
        <td class="list_discription">
            <dl>
                <dt><%= book.name %></dt>
                <dd><%= truncate(strip_tags(book.description), length: 300) %></dd>
                <dd class="list_review_count"><%= book.review_count %> Reviews!</dd>
            </dl>
        </td>
        <td class="list_book_price"><%= book.price %> KRW</td>
        <td class="list_action"><%= link_to 'Show', book %><br />
            <%= link_to 'Edit', edit_book_path(book) %><br />
            <%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Book', new_book_path %>

여기서 특징적인 부분만 설명하도록 하겠다.

 1. cycle template : 두개의 값을 돌아가면서 적용시켜 준다.

 2. image_tag template : <image> tag역할을 하며 각각의 파라미터는 Image URL과 테그의 속성값들이다.

 3. truncate(strip_tag([text]), length: [number]) : text를 number길이만틈 잘라내어 보여준다.

 


  SCSS 정의


 이제 CSS 파일에 CSS만 적용시켜 주면된다.

 

 작성전에 SCSS의 특징인 계층적인 정의에 대해서 알아보자.

<div class="wrap">

<div class="test1">

</div>

</div>

 

라는 형식의 HTML에서 기존 CSS는 이렇게 정의했을 것이다.

.wrap{

width:960px;

padding:10px 0px 10px 0px;

}

.wrap .test1{

width:300px;

margin-left: 50px;

}


  위와 같은 형식을 SCSS에서는 다음과 같이 정의해주면 된다.

.wrap{

width:960px;

padding:10px 0px 10px 0px;


.test1{

width:300px;

margin-left:50px;

}

}


 필자 생각으로는 SCSS의 방식이 훨씬 보기 좋고 획기적으로 보인다.


 이제 이를 이용해서 CSS를 정의해보자.

> vi app/assets/stylesheets/book.css.scss

// Place all the styles related to the Books controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

.books{
  width: 960px;

  table{
    border-collapse: collapse;
  
    tr td{ 
      padding: 10px;
      vertical-align: top;
    }   

    .list_header{
      font-weight:bold;
      font-size: 20px;
      background: #C2B0D7;

      th{ 
        padding: 10px 15px;
      }   
    }   
    
    .list_image{
      width: 90px;
      height: 120px;
    }   

    .list_discription{
      dl {
        margin: 0;
      }   
      dt{ 
        font-weight:bold;
        font-size: 16px;
        margin-bottom:20px;
      }   
      dd{ 
        margin: 0;
        color: #708090;
        font-size: 12px;
      }   
      .list_review_count{
        vertical-align: bottom;
        text-align: right;
        color: #333;
        padding-top: 10px;
      }   
    } // list discription

    .list_book_price{
      vertical-align: middle;
      text-align: center;
    }

    .list_action{
      a{
        text-decoration:none;
      }
      vertical-align:middle;
      text-align:center;
    } // list action

    .list_line_even{
      background: #C4C4C4;
    }
    .list_line_odd{
      background: #B0C4D4;
    }
  } // table
}


이렇게 적용된 페이지는 다음과 같은 페이지를 보여준다.

역시 나의 디자인이란... 최대한 노력해본건데 ㅋㅋㅋ....



  마무리...


 CSS 적용이 먼가 더 간단해진 건 없지만, Selector 에서 편리함을 제공해주는 것 같다.

 이제 왠만큼 웹페이지를 레일즈를 통해서 뽑아낼 준비가 거의다 되가는 느낌이 든다...