before_action 에서는 메소드 호출하는 것 밖에 안되는 줄 알았던 며칠 전까지의 나 ..
권한 관련해서 작업을 하다 보니 before_action 에 권한을 파라미터로 넘기고 싶다는 생각이 들었다.
혹시 before_action 에도 파라미터를 넘길 수 있나 ... ? 반 장난 반 진심으로 찾아 봤는데
before_action 에도 파라미터를 넘길 수 있다는 걸 알고 충격을 받아버렸다 ......
그래서 오늘은 Rails 에서 before_action 을 사용할 수 있는 방법을 정리해보기로 했다.
모든 액션이 실행되기 전에 먼저 실행되는 필터
기본 문법은 아래와 같이 사용하면 된다.
before_action :method
실제 컨트롤러에 적용한다고 했을 때에는 Controller 파일 명 바로 아래에 명시해주면 된다.
class TestController < ApplicationController
before_action :test
end
이렇게 사용해 주는 경우 다른 액션들이 일어나기 전 test 메소드가 먼저 실행 되게 된다.
특정 액션에서만 메소드를 실행시키고 싶을 때에는 뒤에 only 를 붙여서 사용해준다.
before_action :메소드, only: [:액션]
only 뒤에 액션을 지정할 때에는 심볼, 문자열, %w 등 여러 가지 방법을 사용할 수 있다.
심볼 사용 ➡️ before_action :test, only: [:show]
문자열 사용 ➡️ before_action :test, only: ["show"]
%w 사용 ➡️ before_action :test, only: %w[show]
특정 액션에서만 메소드를 실행시키지 않고 싶을 때에는 뒤에 except 를 붙여서 사용해준다.
before_action :메소드, except: [:액션]
해당 방법도 only 와 동일하게 심볼, 문자열, %w 등 여러 가지 방법으로 사용할 수 있다.
하지만 only 보다 가독성이 떨어지기 때문에 보통 except 를 많이 사용하진 않는다.
특정 조건에서만 사용하게 하는 방법으로는 if, unless, proc, lamdba 등 다양한 옵션을 사용할 수 있다.
if
before_action :메소드, if: :메소드
로 옵션을 적게 되면 메소드가 true 인 경우에만 before_action 이 실행된다.
unless
before_action :메소드, unless: :메소드
인 경우 메소드가 false 인 경우에만 before_action 이 실행된다.
if, unless 를 사용할 때 메소드를 넣는 게 아니라 직접 코드를 넣을 수 있다. 코드를 넣을 수 있는 방법은 proc, lamdba 총 두가지 방법이 존재한다.
proc
if, unless 등으로 옵션을 지정할 때 메소드가 아니라 proc 를 사용해서 코드를 지정할 수 있다.
before_action :메소드, if: proc {current_user.id == 1}
이렇게 하면 현재 유저의 아이디가 1인 경우에 메소드가 실행되게 된다.
lamdba
before_action :메소드, if: -> {current_user.id == 1}
이렇게 하면 위의 proc 와 완전 동일한 조건으로 실행되게 된다.
before_action -> { 메소드(파라미터) }
이렇게 작성하면 before_action 에서 실행될 메소드에 파라미터를 넘길 수 있다.
감사합니다 ~