티스토리 뷰

안녕하세요 강정호입니다. 오늘은 navigation바에 로그인, 로그아웃 링크를 처리하는 것에 대해 알아보겠습니다.


작성해야할 내용

1. _navigation.html.erb에서 링크 처리하는 부분

2. application_controller: protected_from_forgery, helper_method, 메서드 3개. 그리고 _navigation.html에서 메서드에 어떻게 접근이 가능한지 알아보기

3. UserController에서 before_action이 하는 역할에 대해서.

4. || = 가 정확히 무엇인지 이해하고 작성하기.

5. <%= %>와 <% %> 의 차이에 대해 알아보기.



ApplicationController에 로그인 유효검사 메서드 작성


class ApplicationController < ActionController::Base

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception

helper_method :current_user, :logged_in?

def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end

def logged_in?
!!current_user # current_user가 있으면 true, 없으면 false
end

def require_user
if !logged_in?
flash[:danger] = "You must be logged in to perform that action"
redirect_to root_path
end

end

end

ApplicationController에는 위와 같이 코드가 작성되어 있습니다.


protected_from_forgery : CSRF 공격을 막기 위한 것입니다.(CSRF 공격이란?). CSRF란 한 마디로 요약하면 "해커가 사용자의 회원정보를 탈취하여 회원인것처럼 하는 것" 입니다.


helper_method : ApplicationController에 helper_method를 선언하고 적용할 메서드의 이름을 입력합니다. 그렇게 되면 view에서 Controller의 메서드를 호출할 수 있습니다. 


<% if logged_in? %>
<li><%= current_user.username %></li>
<li><%= link_to 'Log out', logout_path, method: :delete %></li>
<li><a href="#">Link</a></li>

위와 같이 View에서 ApplicationController의 current_user와 logged_in? 메서드를 호출하여 View에서 로그인 처리를 할 수 있습니다.

하지만 ApplicationController외에 상속받는 컨트롤러에서는 helper_method를 적용할 수 없습니다.



!!current_user : current_user 메서드를 호출하고, 반환되는 결과값을 느낌표2개(!!) 연산자로 boolean 결과값으로 변환합니다. 느낌표(!)를 연속으로 2개를 입력하면 결과값을 true, false로 변환하여 boolean형태로 반환합니다. 




_navigation.html.erb에서 로그인 링크 처리하기


<ul class="nav navbar-nav navbar-right">
<% if logged_in? %>
<li><%= current_user.username %></li>
<li><%= link_to 'Log out', logout_path, method: :delete %></li>
<li><a href="#">Link</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
<% else %>
<li><%= link_to 'Login', login_path %></li>
<li><%= link_to 'Sign up', signup_path %></li>
<% end %>

</ul>


<% if logged_in? %> : Embedded Ruby 구문을 사용하여 logged_in? 메서드를 호출합니다. 이 때 current_user 객체가 있다면 true, 아니라면 false를 반환합니다. 그래서 true라면 if문 아래의 구문들이 실행됩니다.


<% else %>

<% %>.  : 만약 logged_in?이 false가 나게되면 else 부분이 실행이 되면서 Login, Sign up 문구가 네비게이션 바에 뜨게 된다.




||= 기호의 쓰임


a ||= b 일 때, 이 뜻은 "만약 a가 정의되지 않았거나 false라면 b를 a에 할당한다"는 뜻이다.

a || a=b 라는 뜻인데, 즉 a 또는 a=b 둘 중 하나를 택하는 식이다.


결국 ||= 연산자를 삼항식으로 작성하면 다음과 같은 뜻을 가진다

a ? a : a=b  a가 존재하여 true이면 a로 사용하고, false라면 a에 b를 할당하여 사용한다.


예를 들면 다음과 같다.



임베디드 루비에서 <%= %>와 <% %> 차이점



<% %> : 루비 코드를 실행하는 엠베디드 루비 괄호문. if문, else문 등 어떠한 루비 코드를 실행할 수 있다.


< %= %> : 루비 코드를 실행하고, 무언가를 출력할 때 사용한다. 예를 들면 article 제목, article 내용, user 이름을 출력할 때 사용한다.

1) <%=@article.title %>

2)<%=@article.contents %>

3)<%=@user.name %>

이와 같이 임베디드 루비 코드를 사용하면 View 페이지에서 문자로 출력이 가능하다.






























댓글