라벨이 Ruby on rails인 게시물 표시

레일즈에서 여러 개의 db records를 한 번에 수정하고 싶다면? update_all 을 쓰자 ! (How to update db records at once in Ruby on Rails)

## 레일즈에서 여러 개의 db records를 한 번에 수정하고 싶다면? update_all 을 쓰자 ! (How to update db records at once in Ruby on Rails) 만약 `User` 라는 모델이 있고, `loginname`, `name`, `role` 라는 `column` 이 있다고 가정한 후 example 을 봅시다. 모든 user 의 role 을 "customer" 로 변경해봅시다. 아래와 같이 하면 끝! ``` User.update_all(role: "customer") ``` 이럴 일이 있을지는 모르겠지만, loginname 을 name 으로 모두 바꿔야한다면? ``` User.update_all('name = loginname') ``` 너무 간단하죠? 다만 Active Record callbacks 또는 validations 이 트리거되지 않기 때문에(예를 들어 user를 update하는 경우 무엇을 한다. 또는 user를 update할 때 무엇을 validation 한다.) 이 점을 참고해야해요 ! 또, callbacks 이 트리거되지 않아서 updated_at, updated_on column 들이 자동적으로 update되지 않는다는 점을 참고해야해요 !

루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 4, 마지막 (How to build authentication system without devise gem in Ruby on Rails)

## 루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 4, 마지막 (How to build authentication system without devise gem in Ruby on Rails) 쿠키, 세션을 이용해 로그인 기능을 구현해봤습니다.([지난 포스트 참고](http://ghkdgh2365.blogspot.com/2020/07/devise-gem-3-how-to-build.html)) 이번엔 JWT(JSON Web Token)를 이용해 로그인을 구현하겠습니다. 구현 방법은 로그인 요청이 왔을 때, 로그인에 성공하면 서버에서 토큰을 생성한 뒤 클라이언트(브라우저)에게 전달합니다. 이후 클라이언트가 유저에 대한 정보를 요청해야할 때, 받은 토큰을 가지고 서버에 요청해 서버가 토큰 정보를 통해 해당 유저에 대한 정보를 제공합니다. 참고로 로드밸런싱처럼 서버를 확장하거나, 모바일 앱에서 인증을 확인하는데 있어서, 이전 방법보다 JWT가 훨씬 유용하기 때문에, JWT를 이용한 로그인을 많이 사용하고 있는 추세입니다. 그럼 이제 JWT를 이용해 로그인을 구현해보도록 하겠습니다. `개발환경 Ruby 2.7.0 / Rails 6.0.2.2` JWT을 만들기 위해 gem 을 설치하겠습니다. `Gemfile` 파일에 아래와 같이 추가합니다. ``` # JWT 생성 및 사용 gem 'jwt' ``` 추가했다면 저장하고 터미널에 아래와 같이 명령어를 실행합니다. ``` bundle install ``` 설치가 끝나면 `lib` 디렉토리에 가서 `json_web_token.rb` 이라는 파일을 만들고 아래와 같이 코드를 입력해줍니다. 생성된 JWT를 해석할 때 사용됩니다. ``` class JsonWebToken def self.decode(token) return HashWithIndifferentAccess.new(JWT.decode(token, Rails.application.credentials.secret...

루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 3 (How to build authentication system without devise gem in Ruby on Rails)

## 루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 3 (How to build authentication system without devise gem in Ruby on Rails) [지난 포스트](https://ghkdgh2365.blogspot.com/2020/07/devise-gem-2-how-to-build.html) 에서 쿠키(Cookie)를 이용한 로그인, 로그아웃을 구현했습니다. 이번에는 세션을 이용한 로그인, 로그아웃을 구현하겠습니다. 차이점은 다음과 같습니다. 쿠키를 이용했을 때는 사용자 브라우저에 아이디, 비밀번호를 저장하고 이를 서버에 보내서 검증했다면, 세션을 이용할 때에는 서버에서 검증에 필요한 정보를 저장한 뒤 그 정보를 사용자 브라우저에게 보내주고, 다시 그 정보를 서버에 보내 검증한다는 점이 차이점입니다. 아래 구현 방법을 보시면서 차이점을 확인해보면 이해가 더 잘 될 것입니다. #### 3. 세션을 이용한 로그인 세션을 이용한 로그인, 로그아웃 구현을 위해 새로운 컨트롤러를 생성합니다. `rails g controller session` 으로 생성하거나, 직접 디렉토리(`controllers`)에 파일(`sessions_controller.rb`)을 만들어도 됩니다. 만들고 나면 `controller/sessions_controller.rb` 파일이 생성되고 아래와 같은 코드가 보일 것입니다. ``` class SessionsController 세션 로그인 ``` 확인이 되었으면 `home/index.html.erb` 에 아래와 같이 추가합니다. ``` Hello World ! ``` 이제 로그인 화면이 생겼으니 로그인할 수 있도록 `controllers/sessions_controller.rb` 에 가서 아래와 같이 입력합니다. ``` def create if params[:email].pr...

루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 2 (How to build authentication system without devise gem in Ruby on Rails)

이미지
## 루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 2 (How to build authentication system without devise gem in Ruby on Rails) ##### 회원가입이 되었으니 로그인 기능을 만들어보도록 하겠습니다. 혹시나 회원가입 파트가 필요한 분은 아래 링크에 들어가 확인해보시기 바랍니다. [루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 - 회원가입](https://ghkdgh2365.blogspot.com/2020/03/devise-gem-how-to-build-authentication.html) 추가적으로 회원가입 후 축하 이메일 기능을 구현하고 싶은 분은 아래 링크에 들어가 확인해보시기 바랍니다. [루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기](https://ghkdgh2365.blogspot.com/2020/05/creating-mail-function-by-using-ruby-on.html) --- #### 2. 쿠키를 이용한 로그인 먼저 로그인 화면이 필요하겠죠? 먼저 `controllers` 폴더에 `cookie_controller.rb` 파일을 만들어줍니다. 그 다음 아래와 같이 작성합니다. ``` class CookieController 로그인 ``` 그 다음 `routes.rb` 파일에 가서 아래 같이 입력해줍니다. ``` get 'cookie/new' ``` 이제 `localhost:3000/cookie/new` 로 브라우저에 들어가보면 로그인 화면이 보입니다. 만약 안보인다면 코드를 다시 한 번 보시고, 서버가 켜졌는지 확인해보세요.(만약 서버가 꺼져있다면, 커맨드 창에 `rails s` 를 입력해주시면 서버가 켜집니다.) 편의를 위해 로그인 화면으로 가는 링크를 만듭니다. ``` Hello World ! ``` 그 다음, 로그인 버튼을...

Rails.ajax 를 사용해서 POST Request 보내고 레일즈 Controller에서 받는 방법(How to request and receive POST request by using Rails.ajax at Ruby on Rails)

## Rails.ajax 를 사용해서 POST Request 보내고 레일즈 Controller에서 받는 방법(How to request and receive POST request by using Rails.ajax at Ruby on Rails) 레가시 코드가 Rails.ajax를 사용하고 있어, Rails.ajax로 새로운 function 을 만들어 사용하려고 했는데, POST의 경우 data가 잘 넘어가지 않았다. 정확히 말하면, data 형태가 object 형태로 전송되어 Rails 쪽에서 데이터 처리를 할 수 없었다. 그래서 방법을 찾아본 결과 데이터형태를 FormData 형태로 변환한 뒤 보내니, 원하는 JSON 형태로 받을 수 있었다. 자세한 방법은 다음과 같다. ``` //some.js let hashData = {"one": 1, "two": 2, "three": 3} let someData = new FormData() someData.append("data", JSON.stringify(hashData)) Rails.ajax({ url: '/something', type: 'POST', data: someData, success: function(response) { console.log(response) } }) ``` 위와 같이 보내고 싶은 데이터를 FormData 객체에 append 로 JSON.stringify 함수로 변환해 넣으면 된다. Rails Controller에서는 다음과 같이 받아서 사용하면 된다. ``` # some_controller.rb data = JSON.parse(params["data"]) ``` 출처: stackoverflow 에서 참고한건데 다시 찾으려니 못찾겠음..ㅠ

루비 온 레일즈 프로덕션 환경에서 컨트롤러 변수들을 확인하는 방법(How to view variable of controller in Ruby on Rails production)

## 루비 온 레일즈 프로덕션 환경에서 컨트롤러 변수들을 확인하는 방법(How to view variable of controller in Ruby on Rails production) 보통 개발 환경에서 puts 또는 p 로 변수를 프린트해 console로 확인하는 경우가 있는데, 프로덕션 환경에선 puts 또는 p 로 확인하기가 어렵다. 따라서 아래와 같이 변수들을 확인해보는 것을 권장한다. ``` Rails.logger.info "Time: #{Time.now}" ``` 이 때, `/config/environments/production.rb` 또는 `/config/environments/staging.rb`에서 아래와 같이 log level을 설정해줘야 한다. ``` config.log_level = :info ``` 참고 : https://stackoverflow.com/questions/16824355/logging-in-ruby-on-rails-in-production-mode log level 참고 : https://guides.rubyonrails.org/debugging_rails_applications.html

루비 온 레일즈에서 해시 타입의 데이터를 키 또는 밸류를 기준으로 정렬하는 방법(How to sort hash by value or key of hash in Ruby on Rails) ###

## 루비 온 레일즈에서 해시 타입의 데이터를 키 또는 밸류를 기준으로 정렬하는 방법(How to sort hash by value or key of hash in Ruby on Rails) ### Hash 형식의 데이터를 value를 기준으로 정렬하는 방법에 대해 알아보자. 오른차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| v}.to_h # => {:b=>1, :c=>2, :e=>3, :d=>4, :a=>5} ``` 내림차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| v}.reverse.to_h # => {:b=>1, :c=>2, :e=>3, :d=>4, :a=>5} ``` ### Hash 형식의 데이터를 key를 기준으로 정렬하는 방법에 대해 알아보자. 오른차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| k}.to_h # => {:a=>5, :b=>1, :c=>2, :d=>4, :e=>3} ``` 내림차순 정렬은 아래 코드와 같다. ``` hash = { a: 5, b: 1, c: 2, d: 4, e: 3 } hash.sort_by {|k,v| v}.reverse.to_h # => {:e=>3, :d=>4, :c=>2, :b=>1, :a=>5} ```

루비 온 레일즈에서 세션 삭제하는 법 (How to delete session data in Ruby on Rails)

## 루비 온 레일즈에서 세션 삭제하는 법 (How to delete session data in Ruby on Rails) 기존 사용자의 로그인 세션이 남아 있어 오류가 생기는 현상이 있어, 강제로 해당 사용자의 로그인 세션을 지우고자 했다. 아래의 방법처럼 해결했는데 가장 좋은 방법인지는 모르겠다. 먼저 session data를 출력시키는 방법은 아래와 같다. ```ruby session.inspect ``` 그 다음 key로 삭제해주는 방법은 아래와 같다. ```ruby session.delete(:user_id) ```

루비 온 레일즈에서 split, strip, join 메소드 사용법(How to use split, join in Ruby on Rails)

## 루비 온 레일즈에서 split, strip, join 메소드 사용법(How to use split, join in Ruby on Rails) 해시태그를 구현하는 중에 split, strip, join 을 사용하게 되서 기록을 남긴다. input text field 에 "바나나, 딸기, 키위, 사과" 라고 적고 저장하면 바나나, 딸기, 키위, 사과 라는 각각의 해시태그가 만들어졌으면 했다. 그걸 위해 split 을 사용했다. ```ruby text = "바나나, 딸기, 키위, 사과" #text field로 저장한 값 array_hashtag = text.split(",") # => ["바나나", "딸기", "키위", "사과"] ``` 위와 같이 String에 있는 값들을 "," 단위로 쪼개 배열에 넣어준다. 쪼개서 배열에 들어갔으니 저 배열을 하나씩 해시태그로 저장하면 됐다. 근데 문제는 만약 사용자가 띄어쓰기를 잘못하면 어떻게 하나 라는 문제가 생겼다. 예를 들어. "바나나 ,딸기 , 사과, 키위 " 이런 식으로 말이다. 그런 문제를 해결하기 위해 strip 메소드를 사용했다. ```ruby text = "바나나 ,딸기 , 사과, 키위 " array_hashtag = text.split(",") # => ["바나나 ", "딸기 ", " 사과", " 키위 "] array_hashtag.map! {|hashtag| hashtag.strip} # => ["바나나", "딸기", "사과", "키위"] ``` 그리고나서 저장한 해시태그 전부를 출력하려고 하는데 대괄호, 각각의 따옴표를 삭제해서 출력하고...

루비 온 레일즈에서 Strong Parameters 를 사용할 때 permit이 아닌 파라미터를 사용하는 방법(How to use unpermitted parameter by using Strong Parameters in Ruby on Rails)

## 루비 온 레일즈에서 Strong Parameters 를 사용할 때 permit이 아닌 파라미터를 사용하는 방법(How to use unpermitted parameter by using Strong Parameters in Ruby on Rails) Strong Parameters는 강력한 보안을 위해 사용된다. 하지만 모델의 속성(attribute)이 아니지만 하나의 모델 form에서 받아야하는 파라미터가 있을 수 있다. 그럴 때 어떻게 할까? 라는 질문에 답을 해보자. 아래와 같은 컨트롤러에서 "special_attribute" 라는 파라미터로 값을 넘겨받아야 한다고 가정해보자. ```ruby def action if @instance.save(model_params) redirct_to :back end end private def model_params params.require(:model).permit(:attribute1, :attribute2) end ``` 그런 경우 아래와 같이 코드를 작성할 수 있다. ```ruby def action if @instance.save(model_params) special_attribute = params[:model][:special_attribute] puts "#{special_attribute}" redirct_to :back end end private def model_params params.require(:model).permit(:attribute1, :attribute2) end ```

루비 온 레일즈 프라이빗 메소드 사용하기(How to use private method in Ruby on Rails)

## 루비 온 레일즈 프라이빗 메소드 사용하기(How to use private method in Ruby on Rails) 루비 온 레일즈를 사용하다보면 private method 를 정의해서 사용할 때가 있다. 사용 시 주의사항에 대해서 알아보자. 아래와 같은 코드가 있다고 가정한다. ```ruby class Dog def bark puts "멍멍" end private def sounds_of_mind puts "밥 주세요" end end ``` jindo 라는 instance 객체를 만든 뒤 bark 메소드를 사용하면 아래와 같이 나타난다. ```ruby jindo = Dog.new jindo.bark 멍멍 => nil ``` 아래와 같이 sounds_of_mind 메소드를 사용하면 아래와 같이 나타난다. ```ruby jindo = Dog.new jindo.sounds_of_mind NoMethodError (private method `sounds_of_mind' called for #Dog:..>) ``` 즉, private method는 인스턴스에서 바로 호출해 사용할 수 없는 메소드인 것이다. 그러면 어떻게 사용해야하나? 바로 public method를 이용해 사용할 수 있다. 먼저 아래처럼 코드를 정의한다. ```ruby class Dog def bark puts "멍멍" sounds_of_mind end private def sounds_of_mind puts "밥 주세요" end end ``` 그 다음 아래와 같이 bark 를 호출하면 private method 인 `sounds_of_mind`가 호출되는 것을 볼 수 있다. ```ruby jindo = Dog.new jindo.bark 멍멍 밥주세요 => nil ```

루비 온 레일즈에서 동시에 다수 사용자가 DB 수정이 필요한 작업을 수행할 때 처리하는 방법, 동시성 제어, lock(At the same time, how to handle when multiple users perform a task that requires DB modification in Ruby on Rails, concurrency control, lock)

## 루비 온 레일즈에서 동시에 다수 사용자가 DB 수정이 필요한 작업을 수행할 때 처리하는 방법, 동시성 제어, lock(At the same time, how to handle when multiple users perform a task that requires DB modification in Ruby on Rails, concurrency control, lock) 동시에 다수 사용자가 동일한 row의 값을 변경하게 되는 때가 있다. 예를 들어, 판매 물품의 재고가 1개 남았는데 동시에 2명의 사용자가 그 물품을 사게 된다면 어떻게 될까? 재고는 1개인데 둘 다 구매한 것으로 저장된다면? 좋은 예시(송금 예시와 같은)인지는 잘 모르겠으나, 이런 경우 처리할 수 있는 방법 중 하나를 적어보려고 한다. ```ruby product = Product.first product.with_lock do if product.amount > 0 product.amount -= 1 product.save! end end ``` 특정 상품에 lock 처리를 해서 1개 남아있을 때, 2명이 동시에 구매 시도를 하더라도 1명만 구매할 수 있도록 처리를 한다.

루비 온 레일즈 사이드킥에서 예약 된 특정 작업을 삭제하는 법 (How to delete specific scheduled job in Ruby on Rails with Sidekiq)

## 루비 온 레일즈 사이드킥에서 예약 된 특정 작업을 삭제하는 법 (How to delete specific scheduled job in Ruby on Rails with Sidekiq) 루비 온 레일즈에서 사이드 킥으로 특정 작업을 예약한 후 작업을 할 수 있는데, 간혹 예약 된 특정 작업을 삭제하고 싶을 때가 있다. 예를 들어, 요금을 내지 않은 A고객에게 매일 한 번씩 미납된 요금에 대한 알림을 주도록 예약했는데 A고객이 자신의 요금은 부당하다고 얘기하는 경우, 잠시 멈추고 또는 영원히 알림을 제거해야할 수 있다. 좀 억지라고 느낄 수 있지만, 딱히 좋은 예시가 떠오르지 않으니 넘어가자. 어쨌든 그런 경우 예약된 작업을 제거하는 방법에 대해 알아보자. 아래의 코드는 예약된 작업들을 scheduled_job 에 담는 코드다. ```ruby scheduled_job = Sidekiq::ScheduledSet.new ``` 그 다음, schedule_job 중 내가 원하는 특정 작업을 아래와 같이 찾아 삭제할 수 있다. Job class 가 ShowMeTheMoney 이고 내 어플리케이션 서버의 Model id 를 파라미터로 사용한 경우 아래와 같이 class와 model id 를 찾아 삭제할 수 있다. ```ruby scheduled_job.each do |job| if (job.args.first["job_class"] == "ShowMeTheMoney" && job.args.first["arguments"][0]["_aj_globalid"] == "gid://application-server/Model/#{model.id}") Model.find(model.id).destroy end end ``` 아래 코드를 콘솔에서 확인해 현재 본인의 예약 된 작업이 어떤 식으로 구성되어있는지 확인해보고 그에 맞게 수정해보는 것도...

루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기(Creating mail function by using Ruby on Rails ActionMailer)

이미지
## 루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기(Creating mail function by using Ruby on Rails ActionMailer) Ruby on Rails ActionMailer 를 이용해 메일 기능을 구현해보려고합니다. 이 때 준비된 예제가 있으면 좋겠다 싶어 기존 게시글(아래 링크)을 활용해보려고 합니다. 회원가입을 하고나면 회원가입이 되었다고 메일이 오는 경우가 대부분입니다. 이번 예제 또한 회원가입이 정상적으로 완료되면 가입한 이메일 주소로 회원가입 완료에 대한 메일을 보내주는 예제를 해볼까 합니다. 아래 링크를 참고해 쭉 따라하시면 회원가입까지 할 수 있습니다. ### [루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 (How to build authentication system without devise gem in Ruby on Rails)](https://ghkdgh2365.blogspot.com/2020/03/devise-gem-how-to-build-authentication.html) 위 링크까지 코딩이 다 되었다는 가정하에, 메일 기능을 구현하겠습니다. 구현 순서는 다음과 같습니다. 1. Action Mailer 와 관련된 파일 등을 구현한다. 2. 보낼 메일 내용을 작성한다. 3. 메일 구현에 필요한 환경설정을 세팅한다. 4. 회원가입을 하고 메일을 받아본다. 그럼 이제 1번부터 시작하겠습니다. 콘솔에 아래와 같이 입력합니다. ```ruby rails generate mailer UserMailer ``` 그럼 아래와 같이 파일들이 생성될 것입니다. ```bash $ rails generate mailer UserMailer create app/mailers/user_mailer.rb invoke erb create app/views/user_mailer invoke test_unit create...

루비 온 레일즈에서 최신 로그들을 가지고 오고 싶다면? 부모 모델과 연결된 자식 모델의 마지막 행들의 값을 가지고 오고 싶다면? (How to get recently log or last row of child model Ruby on Rails )

이미지
## 루비 온 레일즈에서 최신 로그들을 가지고 오고 싶다면? 부모 모델과 연결된 자식 모델의 마지막 행들의 값을 가지고 오고 싶다면? (How to get recently log or last row of child model Ruby on Rails ) 최근 루비 온 레일즈 프로젝트에서 부모 모델의 각 id에 연결 된 자식 모델의 행 중 맨 마지막 행의 특정 컬럼값이 몇 개인지 세야 했다. 예를 들자면 아래 이미지와 같은 느낌이다. 이미 SQL을 그대로 삽입해서 구현한 코드는 있었다. 코드는 아래와 같다. ```ruby parents = ParentModel.where("created_at > ?", date_value) parents.where("(SELECT event FROM child_model WHERE parent_model_id = parent_models.id ORDER BY created_at DESC LIMIT 1) = ?", ChildModel.events[:event_name]).count ``` 그러나 Rails way, DB 호환성 등을 위해 ActiveRecord를 사용한 코드로 바꿔야했다. 바꾼 코드는 다음과 같다. ```ruby parents = ParentModel.where("created_at > ?", data_value) #큰 의미 없음 ChildModel.where(parent: parents, id: ChildModel.group(:parent_model_id).maximum(:id).values).group(:event).count["event_name"] ``` ActiveRecord를 사용한 코드라 바꿨고, 걸리는 시간도 조금 줄었다. 코드 설명을 하자면 ChildModel에서 각 parents를 가지고 있으면서 각 ChildModel의 parent 모델의 id 값중 가장 큰 값(최근에 저장된 child mod...

루비 온 레일즈 eval (eval in Ruby on Rails)

## 루비 온 레일즈 eval (eval in Ruby on Rails) #### 아래와 같이 json 형식으로 값을 뽑아내야하는데 pluck을 사용하니 그 아래와 같이 나왔다. ```ruby "[{\"x\":0,\"y\":-4,\"z\":2},{\"x\":16,\"y\":-4,\"z\":4},{\"x\":16,\"y\":4,\"z\":8},{\"x\":0,\"y\":4,\"z\":5},{\"x\":0,\"y\":0,\"z\":2}]" ``` pluck 으로 뽑아낸 결과 ```ruby ["{:x=>0, :y=>-4, :z=>2}", "{:x=>16, :y=>-4, :z=>4}", "{:x=>16, :y=>4, :z=>8}", "{:x=>0, :y=>4, :z=>5}", "{:x=>0, :y=>0, :z=>2}"] ``` 그래서 사용한 방법은 map 과 eval을 이용하는 것이다. 모델에서 뽑아낸 행들.map{|m| eval(m.모델의 컬럼네임) if 모델의 컬럼네임.present?}

루비 온 레일즈 pluck 메소드 (how to use pluck, eval method in Ruby on Rails)

## pluck 메소드 간단 소개 #### 예를 들어 모든 유저의 이름을 하나의 배열에 담을 때 어떻게 해야 효율적일까? 와 같은 문제를 해결 할 때 유용하게 사용할 수 있는 메소드가 pluck 이다. 물론 아래와 같이 반복문을 사용할 수도 있다. ```ruby user = [] User.all.each do |u| user
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" `...

루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 (How to build authentication system without devise gem in Ruby on Rails)

##### 해당 포스트의 목표는 로그인 기능을 devise gem을 이용하지 않고 직접 구현하는 것입니다. 직접 구현해보면서 로그인 기능이 어떻게 구현되는지에 대해 이해해보고자 합니다. ##### 만약 Ruby on Rails 입문하고 싶거나, 입문하지 얼마 되지 않았다면, 해당 글을 따라해보기를 권합니다. 로그인에 대한 이해 뿐만 아니라, Ruby on Rails의 CRUD (Create, Read, Update), Background Job 등을 경험해볼 수 있기 때문입니다. 구현 순서는 아래와 같습니다. 루비 온 레일즈는 이미 다 설치되어 있다고 가정하고 진행합니다. *루비 온 레일즈 설치 방법*은 https://gorails.com/setup/osx/10.15-catalina 와 같은 사이트를 참고하시기 바랍니다. #### 1. 회원가입 구현(feat. MVC(Model, View, Controller)) #### 2.쿠키를 이용한 로그인 #### 3. 세션을 이용한 로그인 #### 4. JWT를 이용한 로그인 #### 5. 사용자 메일 인증 --- ### 1. 회원가입 구현(feat. MVC(Model, View, Controller)) 로그인을 구현하기 위해 사용자 정보를 저장할 User table을 만들 것입니다. **명령어로 한 번에 모델, DB 테이블, 테스트 파일 생성** --- ```bash rails g model User ``` 위와 같은 명령어로 model 파일과, migration 파일, test를 위한 파일들을 동시에 만들 수 있습니다만 직접 파일을 만드는 경우에는 아래와 같습니다. **모델, DB 테이블, 테스트 파일을 따로 생성** --- 아래와 같이 models 폴더에 `user.rb` 파일을 만듭니다. 사진 1 만든 파일 안에 아래 코드를 입력합니다. 모델 파일을 만들었습니다. user.rb ```ruby class User # ``` 한 번 똑같은 이메일로 회원가입을 해봅시다. `r...

루비 온 레일즈에서 migration 활용법 (How to use migration in Ruby on Rails)

## Ruby on Rails 에서 migration 활용법 table 을 만들거나 수정하는 경우 migration 파일을 이용한다. 해당 부분은 많이 찾아볼 수 있을 것이기 때문에 이 글에선 migration 시 실행하는 파일에 대해서만 알아보려고 했으나 설명하려다보니 그냥 추가하는 부분도 같이 설명해보려고 한다. --- ### attribute (column) 추가 예를 들어서 User table에 role 이라는 column 을 추가해야 할 때를 가정한다. 아래와 같이 명령어를 실행하면 db > migrate 폴더에 파일이 생성된다. ``` rails g migration add_컬럼명(column)_to_테이블명(table) 컬럼명:데이터타입 #Ex) rails g migration add_role_to_user role:integer ``` 파일을 열면 아래와 같은 코드를 확인할 수 있을 것이다. ```ruby class AddRoleToUser