Hash에서 값을 얻는 방법(feat. try, fetch, dig) (How to use try, fetch and dig for getting value from hash) ### Hash에서 값을 얻는 방법 데이터를 다루다 보면 자주 Hash (다른 언어에선 Dictionary 라고도 하는)를 사용하게 되는데, Hash에서 데이터를 얻을 때, 어떻게 뽑아내는지와 주의해야할 점에 대해 적으려고 한다. 예제를 통해 알아보자. --- #### fetch 일단 간단한 Hash를 하나 만들어본다. ```ruby hash = {:apple=>{:color=>"red"}, :banana=>"yellow", :melon=>"gree "} # => {:apple=>{:color=>"red"}, :banana=>"yellow", :melon=>"green"} ``` 그 다음 [] 으로 값을 얻어보자. banana 키의 yellow 라는 값을 얻고 싶다면, ```ruby hash[:banana] #=> "yellow" ``` 아주 간단하다. 하지만 banana이라는 key가 없거나 오타가 있다면 어떻게 될까? ```ruby hash[:banaan].upcase # NoMethodError (undefined method `upcase' for nil:NilClass) ``` 위와 같이 에러가 뜬다. 이런 상황을 방지하기 위해 `fetch`를 사용한다. ```ruby hash.fetch(:banaan, "yellow").upcase # => "YELLOW" ``` --- #### try 이번엔 red의 값을 찾아보자. ```ruby hash[:apple][:color] # => "red" ``` 하지만 만약 apple 의 값이 nil 이거나 apple이 아니라 오타가 난다면 ? 아래와 같이 에러가 난다. ```ruby hash[:appl][:color] # => NoMethodError (undefined method `[]' for nil:NilClass) ``` 이를 방지하기 위해 try를 사용할 수 있다. 아래와 같이 사용하면 nil을 return 한다. ```ruby hash.try(:[], :appl).try(:[], :color) # => nil ``` 만약 depth 가 길어진다면 계속 try try ... 하게 될텐데 이 때 사용하는 함수가 dig 다(~~디그다디그다닥트닥트닥트~~) --- #### dig ```ruby hash.dig(:apple, :color) # => "red" hash.dig(:appl, :color) # => nil ``` 이렇게 Hash 에서 값을 얻는 방법을 알아봤다.
어드민 유저 권한 시스템 설계(Admin user authority system design)
## 어드민 유저 권한 시스템 설계 ### 문제 상황 - 현재 어드민 페이지 권한 종류가 [전체 읽기/쓰기], [전체 읽기] 밖에 없음 - 전체 읽기 - 다 읽을 수 있음 - 전체 읽기/쓰기 - 다 수정, 삭제할 수 있음 - 어드민 페이지를 이용해야하는 사람은 많음 - 어드민 페이지를 이용하려면 admin 권한을 줄 수 밖에 없는 상황. 그런데 admin 권한이 너무 큼 ### 요구사항 - 기존 권한 시스템을 최대한 가지고 가면서, 필요한 권한만 부여할 수 있는 권한 시스템을 도입해야 함 ### 설계 - 구성 - 유저, 스코프, 메소드로 구성되어있음 - 유저(사용자) - 스코프(기능 또는 페이지 단위) - 어드민 특정 기능 또는 페이지 단위 - 메소드(API 주소) - EX) api::route::get::/api/product/string:oid - 유저는 스코프를 갖고, 스코프는 메소드를 갖고 있음 - 유저는 스코프 리스트, 스코프는 메소드(요청 가능한 API)의 리스트를 가지고 있음 - 유저에게 스코프 할당을 보다 편하게 하기 위해 자주 사용되는 스코프를 preset 으로 묶음
댓글
댓글 쓰기