또한 HAML, SASS, 부트스트랩, 트위터 옴니오스를 사용하여...

시작하기 전 - 이 앱의 깃허브 코드는 다음과 같습니다...

최근에 열린 제3회 Couchbase 샌프란시스코 컨퍼런스는 매우 성공적이었고 환상적인 낮과 밤이었습니다. 컨퍼런스에서 저는 오늘 구축할 바로 그 샘플 애플리케이션을 기반으로 80분간 세션을 진행했습니다. 제 강연의 목적은 Couchbase 내에서 JSON 문서를 모델링하고 전체 맵/리듀스 기능을 활용하여 애플리케이션을 엔드투엔드로 구축하는 방법을 보여드리는 것이었습니다.

이 블로그는 Rails에 대한 지식과 트위터 개발자 포털을 어느 정도 사용한다고 가정합니다. 이전에 Couchbase 또는 Couchbase-Model을 사용해 본 적이 없더라도 걱정하지 마세요. 그 부분을 안내해 드릴 테니까요. 카우치베이스 모델 먼저!

이 앱의 전반적인 아이디어는 사용자가 자신의 바인 동영상을 게시하여 전 세계에서 누가 가장 재미있는 바인 동영상을 보유하고 있는지 대중의 투표를 통해 확인할 수 있다는 것입니다. 사용자는 바인을 제출하기 전에 인증을 받아야 하며, 참조 ID를 통해 어떤 바인이 어떤 사용자에게 속해 있는지 추적해야 합니다. 즉, 각 바인에는 JSON 문서 내에 User_ID가 있어야 하므로 누구의 소유인지 알 수 있습니다.

이제 더 이상 망설이지 말고 Ruby와 Rails를 사용하여 Couchbase 위에 게임화된 애플리케이션을 구축하는 방법을 알아보겠습니다. 리더보드와 경쟁 요소가 있는 소셜 애플리케이션을 만든다는 아이디어는 매우 일반적인 사용 사례이지만, (특히 Ruby 커뮤니티에서는) 잘 문서화되어 있지는 않습니다. 자, 잡담은 그만하고 시작해 보겠습니다!

전제 조건:

  • 카우치베이스 서버 2.0+
  • Ruby 1.9.3+
  • 레일즈 3+

여기에 Rails 앱의 모든 개별 보석을 게시하는 대신, 간단히 여기를 클릭하세요 을 클릭하여 내 젬파일을 보고 애플리케이션에 어떤 루비 젬을 번들로 제공해야 하는지 확인합니다.

여기서 한 가지 주의할 점은 제가 선택한 루비 서버입니다. 저는 Puma를 사용하고 있습니다. 이것은 이 작은 사용 사례에서 반드시 이점이 있는 것은 아니며 개인적인 습관입니다. Puma는 기본적으로 포트 : 9292에서 시작하는 Ruby용 스레드 동시 웹서버입니다. 편한 웹 서버를 사용하면 되고, 'rails s' 또는 'rails server'로 앱을 시작하기만 하면 됩니다.

이제 코드를 시작하기 전에 Couchbase 인스턴스에 'rvine'이라는 버킷을 만들어 보겠습니다. 이 버킷의 크기는 걱정할 필요가 없으므로 클러스터에 할당된 RAM의 양에 따라 200MB 정도만 설정하면 됩니다.

이제 새로운 Rails 앱을 생성해 보겠습니다. 일반적인 명령에 '-O' 플래그를 추가하겠습니다. 이것은 active_record 포함을 건너뛰기 위한 것입니다. (Couchbase에서는 active_record를 사용할 수 없지만, 그래서 Couchbase-Model 젬이 있습니다!).

레일즈 새 리바인 -O

이제 위에 링크된 저장소에서 Gem파일을 복사했는지 확인해 보겠습니다. 이 작업의 중요성은 Couchbase와 카우치베이스 모델 번들로 제공됩니다. Couchbase-Model은 디자인 패턴과 같은 액티브 레코드를 허용하는 Couchbase 젬에 대한 추상화입니다. 이를 통해 Rails 및 Couchbase를 매우 쉽게 시작하고 실행할 수 있습니다. 위의 링크를 클릭하고 자세한 내용을 보려면 보석 세부 정보를 읽어보세요.

젬파일에 두 개의 젬이 있다는 것을 확인하면 '번들 설치'를 실행합니다. 이 작업이 완료되면 Couchbase를 백엔드로 사용하여 Rails 앱을 설정합니다. 터미널의 rails 디렉토리에서 다음 명령을 실행합니다:

레일즈에서 couchbase:config 생성

그러면 설정 디렉토리에 데이터베이스 백엔드와 앱을 연결하는 couchbase.yml 파일이 생성됩니다. 해당 파일을 편집하고 버킷 자격 증명을 입력합니다. 구성 파일에 이를 반영해야 합니다:

공통: &공통
호스트 이름: 로컬호스트
포트: 8091
사용자명:
비밀번호를 입력합니다:
풀: 기본 개발:
< 버킷: rvine

테스트:
< 버킷: rvine

# 프로덕션 서버에서 다음 환경 변수를 설정합니다.
프로덕션:
호스트 이름: <%= 환경['couchbase_host'] %>
포트: <%= 환경['couchbase_port'] %>
사용자명: <%= 환경['couchbase_username'] %>
비밀번호를 입력합니다: <%= 환경['couchbase_password'] %>
풀: <%= 환경['couchbase_pool'] %>
버킷: <%= 환경['카우치베이스_버킷'] %>

이제 이 작업이 완료되었으므로 백엔드 데이터 저장소인 Couchbase에 연결된 Rails 베어본 프로젝트가 있어야 합니다. 간단해 보이시나요? Couchbase-Model은 데이터 모델링과 관련하여 우리의 삶을 1000배 더 쉽게 만들어주기 때문입니다!

이제 다음으로 해야 할 일은 우리의 사용자 및 인증 클래스.

먼저 사용자 모델을 생성해 보겠습니다. app/models/user.rb 파일을 생성합니다.

클래스 사용자 < 카우치베이스::모델

속성 이름
속성 :트위트_사용자명
속성 아바타

def self.찾기_또는_생성하기_로부터_인증_해시(해시)
사용자 = 사용자.find_by_id(해시[:uid])
아니면 사용자
사용자 = 사용자.create!(:id => 해시[:uid],
이름 => 해시[정보][이름],
:트위트_사용자명 => 해시[정보][닉네임],
아바타 => 해시[정보][이미지])

사용자

그리고 속성 는 JSON 문서에 포함하고자 하는 필드입니다. 사용자의 이름, 트위터 사용자 아이디 및 아바타를 수집하고 있습니다. 데이터베이스의 각 사용자에게 고유한 키를 부여해야 합니다. 이 예에서는 사용자의 트위터 UID를 수집하고 이를 통해 해시를 생성하여 사용자 문서의 키를 생성합니다. 데이터베이스에 있는 모든 문서의 키는 고유해야 한다는 점을 기억하는 것이 중요합니다. 또한 주목할 만한 것은 우리가 만든 클래스입니다. 'find_or_create_from_auth_hash' 이 클래스는 주석에 적힌 대로 정확하게 작동합니다! 사용자가 존재하면 해당 사용자를 인증합니다. 존재하지 않으면 수신한 트위터 세부 정보에서 사용자를 생성합니다.

인증 클래스를 처음부터 작성하는 대신 트위터 옴니오스를 사용하여 많은 시간을 절약할 수 있다는 것을 눈치채셨을 것입니다! 가장 먼저 해야 할 일은 트위터 개발팀으로 이동하여 애플리케이션 키를 가져오는 것입니다! 이 작업을 해본 적이 없다면 트위터 계정으로 로그인하세요. 'rvine'이라는 새 애플리케이션을 생성하면 애플리케이션 키 2개가 제공됩니다.

config/initializers/omniauth.rb에 구성 파일을 만듭니다. 이 파일을 만들었으면 파일을 열고 다음 코드를 붙여넣습니다:

레일.애플리케이션.구성.미들웨어.사용 OmniAuth::빌더 do
공급자 트위터, "소비자_키", "소비자_비밀"

이제 트위터 애플리케이션 키로 Omniauth를 설정하고 거의 모든 준비가 완료되었습니다. 다음으로 해야 할 일은 인증 프로세스를 처리하기 위해 Rails 애플리케이션에 경로를 만드는 것입니다. 이제 config/routes.rb 파일을 열고 다음을 입력해 보겠습니다:

일치 '/auth/twitter/callback', :to => 'sessions#create'

이제 Rails에 트위터 인증 콜백을 세션 컨트롤러.... 로 보내도록 지시합니다. 어떤 세션 컨트롤러인가요? 지금 만들어야 합니다.

계속해서 파일 앱/을 만듭니다.컨트롤러/세션_컨트롤러.rb

클래스 세션 컨트롤러 < 애플리케이션 컨트롤러
def create
사용자 = 사용자.찾기_또는_생성하기_로부터_인증_해시(auth_hash)
세션[:user_id] = 사용자.id
플래시[성공] = "클럽에 오신 것을 환영합니다!"
redirect_to_dashboard_path
보호됨
def auth_hash
요청합니다.환경['omniauth.auth']

이 코드에서 볼 수 있듯이 'Create' 메서드는 사용자가 프론트엔드에서 인증을 클릭할 때 User.rb에 정의한 클래스를 호출하여 세션을 초기화하거나 사용자가 아직 존재하지 않는 경우 사용자를 생성합니다. 인증이 완료되면 사용자를 대시보드로 리디렉션합니다. (곧 만들 예정입니다!)

다음으로 application_controller.rb 를 사용하여 현재_사용자를 정의하는 헬퍼 메서드와 사용자가 로그인했는지 확인하는 헬퍼 메서드 등 인증에 대한 헬퍼 클래스를 포함할 수 있습니다.

클래스 애플리케이션 컨트롤러 < 액션 컨트롤러::베이스
보호_프롬_위조def 인증!
만약 signed_in?
반환 true
else
플래시[오류] = "이 페이지에 액세스할 수 있는 권한이 없습니다."
redirect_to(root_path)

def current_user
현재_사용자 ||= 사용자.find_by_id(세션[:user_id])

helper_method 현재_사용자

def signed_in?
!!current_user

helper_method 로그인?

다음으로, 사용자가 승인 시 리디렉션될 대시보드를 만들어야 합니다. 이를 위해 Rails 생성 명령을 사용하겠습니다.

레일에서 컨트롤러 대시보드 생성

이제 파일을 열어 보겠습니다. 앱/컨트롤러/대시보드_컨트롤러.rb 를 클릭하고 다음을 입력합니다:

클래스 대시보드컨트롤러 < 애플리케이션 컨트롤러

def show

대시보드의 프런트엔드 보기를 열고 편집해 보겠습니다. 제 경우에는 HAML 파일이 될 것입니다. ERB를 선택하든 HAML을 선택하든 파일은 거의 동일하게 보일 것입니다! In 앱/보기/대시보드 - show.haml 또는 show.erb 파일을 만들면 됩니다.

%섹션#welcome
.페이지헤더
만약 signed_in?
%h1
안녕하세요, #{current_user.name}
%p
%img{:src => current_user.아바타, :alt => "아바타"}
%p= link_to("모든 덩굴", "/vines")
else
%h1
안녕하세요, 낯선 사람
%p
= link_to("트위터 계정으로 로그인", "/auth/twitter")
%p
&nbsp;

이제 대시보드가 준비되었으니 라우팅을 좀 더 설정한 다음 테스트해 볼 수 있습니다! 열기 config/routes.rb 를 클릭하고 다음을 추가합니다:

리소스 :대시보드

완료했으면 앱을 저장하고 실행한 다음 사용자로 인증합니다.

잘됐네요! 이제 인증이 작동하고 사용자에게 대시보드가 있는 것을 볼 수 있습니다. Couchbase 콘솔을 열면 Rvine 버킷 내부에 사용자가 생성된 것을 볼 수 있습니다!

이제 사용자 및 인증이 준비되었으니 애플리케이션의 주요 부분으로 넘어가 보겠습니다: 바인 동영상입니다! 여기서 시작하려면 바인용 모델을 만들어야 합니다. 안타깝게도 Couchbase-Model은 아직 이 작업에서 레일 생성기를 지원하지 않습니다. 따라서 수동으로  /app/models/vine.rb

이 작업이 완료되면 다음을 입력해 보겠습니다:

require 'open-uri'
require 'uri'
require 'nokogiri'클래스 Vine < 카우치베이스::모델
저장 후 :추출_비디오_URL

belongs_to 사용자

속성 :title
속성 :vine_url
속성 :video_url

1TP5투표 API
속성 점수, :기본값 => 1

validates_presence_of :title, :vine_url

비공개

def 추출_비디오_URL
doc = 노코기리(열기(vine_url).읽기)
self.video_url = doc.css("source").먼저["src"]
저장_콜백_없이

위의 코드에서 볼 수 있듯이 오픈우리, 우리, 노코기리를 포함하고 있습니다. 바인에는 공개 API가 없지만 어떻게든 해당 동영상을 가져와야 하기 때문입니다! 그래서 이러한 라이브러리의 도움을 받아 사용자가 바인 URL을 입력할 때 바인 동영상의 소스를 스크래핑하고 정확한 mp4 URI를 가져오는 교활한 스크립트를 작성했습니다.

클래스 추출_비디오_URL 메서드를 사용하여 호출됩니다. 저장 후. 코드를 보면 노코기리가 사용자가 바인을 게시할 때 입력한 URL을 열고 있는 것을 알 수 있습니다. 그런 다음 바인 페이지의 소스를 검색하여 바인의 실제 mp4 URI를 선언하는 줄을 찾습니다.

그 외에도 각 바인이 사용자에 속하며 제목, 바인 URL(사용자가 입력한) 및 동영상 URL(실제 mp4 URI)에 대한 속성이 있음을 알 수 있습니다. 점수 어트리뷰트도 있습니다. (가장 중요한 속성입니다.) 또한 각 동영상이 1점부터 시작하도록 설정하고 있습니다.

이제 바인 모델에 대한 컨트롤러 및 뷰를 생성해 보겠습니다. 실행합니다:

레일이 비계 덩굴을 생성합니다.

이 시점에서 모델이 이미 존재한다는 충돌 오류가 발생할 수 있습니다. 걱정하지 마세요. 덮어쓰지 않으려면 'N'이라고 말하세요. Couchbase를 찾을 수 없음 오류가 표시될 수도 있습니다. 위에서 언급했듯이 Couchbase-Model은 Rails 모델 생성기와 호환되지 않으므로 걱정하지 마세요.

모든 것이 계획대로 진행되었다면 이제 vines_controller.rb 및 프론트엔드 HAML 또는 ERB 파일이 있는 바인에 대한 전체 보기 폴더를 만듭니다. 계속해서 vines_controller.rb 를 반영하고 파일을 여기에.

컨트롤러 파일에서 다음과 같은 메서드를 보셨을 것입니다. '업보트'.  이것이 바로 바인 동영상에 대한 투표 메커니즘입니다. 이 투표 시스템 구현을 완료하고 실제로 바인 동영상에 투표할 수 있는 공간을 제공하려면 파일을 열어 앱/뷰/바인즈/쇼.haml(또는 .erb)

파일에 영향을 미치는지 확인합니다. 여기에서 찾을 수 있습니다.

투표 시스템이 완전히 작동하려면 다음을 추가해야 합니다. routes.rb 파일:

  리소스 :vines do
회원 do
put upvote

이제 바인 동영상을 표시할 수 있고 투표 메커니즘이 준비되었습니다! 다음으로 해야 할 일은 앱의 메인 페이지를 설정하는 것입니다. 리더보드!  리더보드는 앱의 주요 기능이지만 매우 간단합니다. 파일을 엽니다.  앱/뷰/바인즈/인덱스.haml(또는 .erb)  와 일치하는지 확인하고 여기에 코드.

만약 이것이 일반적인 관계형 Rails 앱이었다면, 우리는 should 이론상으로는 이미 리더보드가 생성되어 각 바인 동영상이 데이터베이스에 나열되어 있습니다.  하지만 여기서는 그렇지 않습니다.

카우치베이스에서는 다음을 사용하여 리더보드를 만들어야 합니다. 조회수 에서 맵/리듀스 기법을 활용하여 실제로 제대로 작동하는 리더보드를 만들 수 있습니다! 그럼 시작해 보겠습니다! 여기서 계속 진행하기 전에, 이전에 Couchbase 뷰를 사용해 본 적이 없다면 다음을 읽어보시기 바랍니다. 이 문서들를 참조하여 Couchbase 뷰가 무엇인지, 어떻게 사용하는지, 그리고 이 Rails 애플리케이션에서 쉽게 사용할 수 있는 방법에 대한 배경 지식을 얻을 수 있습니다.

애플리케이션의 경우, 각 바인의 점수와 제목을 출력하는 뷰를 Couchbase에서 만들어야 합니다. 또한 점수가 가장 높은 바인 동영상이 자연스럽게 리더보드의 맨 위에 표시되도록 점수별로 내림차순으로 정렬해야 합니다.

이전에 Couchbase 보기를 사용해 본 적이 있다면 관리자 콘솔 자체에서 보기를 만들었을 것입니다. 보기는 관리자 UI 내에서, 모든 SDK 클라이언트에서, 그리고 REST API를 통해 만들 수 있습니다. 이 경우 Couchbase-Model에는 애플리케이션에 대한 보기를 생성할 수 있는 독특하고 훌륭한 방법이 있습니다. 간단히 읽어보세요. 이 문서들 를 통해 어떻게 할 수 있는지, 그리고 앞으로 어떻게 할 것인지 알아보세요.

터미널에서 실행하기만 하면 됩니다:

레일 생성 카우치베이스:바인 모두 보기

이제  앱/모델 디렉터리에 vine이라는 이름의 새 하위 디렉터리가 있어야 하며, 하위 디렉터리의 이름은 모두입니다. 이 디렉터리에는 2개의 .js 파일, 즉 map.js와 reduce.js가 있습니다. 지금은 map.js 파일에 관심이 있습니다. 파일을 열고 다음을 입력합니다:

함수(doc, 메타) {
만약 (doc.유형 == "vine" && doc.title) {
emit(doc.점수, doc.title);
}
}

이 Map 함수에서 볼 수 있듯이, 전체 내용을 IF 문으로 감싸고 있습니다. 이것은 인덱스로 행을 내보내기 전에 속성을 확인하기 위한 Couchbase의 모범 사례입니다. 이 경우, IF 문은 속성이 유형 == "포도나무" 를 추가하고 바인에 제목이 있는지 확인합니다. 그런 다음 emit 함수는 문서를 사용하여 인덱스에 행을 생성합니다. 점수 를 인덱싱된 키로 지정합니다. 또한 문서 제목을 출력 값으로 출력하고 있습니다.

를 출력하는 이유는 점수 를 인덱싱된 키로 사용하면 Couchbase가 이 필드에 자동으로 적용하는 유니코드 정렬을 활용할 수 있습니다. 이 경우 가장 높은 점수를 받은 바인을 리더보드의 맨 위로 밀어 올리기 위해 점수가 내림차순으로 정렬되도록 해야 합니다. 이 지도 기능은 자체적으로 잘 작동하며, 지금 애플리케이션을 실행하면 바인 동영상 목록이 표시되지만 순서가 잘못되어 있습니다!

이제 리더보드를 다듬고 제대로 작동하는지 확인하기 위해 Couchbase의 다른 기능을 적용해야 할 때입니다. 이제 보기 쿼리 를 사용하여 최종 제품을 만들었습니다. 다시 한 번 Couchbase-Model을 사용하면 Rails 코드에서 바로 이 작업을 수행할 수 있습니다. 모델 파일을 엽니다.  vine.rb  를 열고 'private' 선언 바로 위에 다음 줄을 추가합니다:

 보기 모두, :limit => 10, 내림차순 => true

이 코드는 뷰에 쿼리 매개변수를 추가하는 데 필요할 뿐만 아니라, 애플리케이션이 애플리케이션에서 어떤 뷰를 사용해야 하는지 알 수 있도록 쿼리 매개변수를 포함하거나 포함하지 않고 Vine.rb 파일에 추가해야 합니다. 이 경우 애플리케이션에서 사용할 보기를 정의할 뿐만 아니라 쿼리 매개변수도 추가했음을 알 수 있습니다:

 :limit => 10, 내림차순 => true

이렇게 함으로써 뷰의 출력을 10개의 결과로 제한하여 점수 은 내림차순입니다.

이제 끝입니다! 몇 개의 Vine 동영상으로 데이터베이스를 채우면 Rate my Vine 애플리케이션이 완전히 작동하는 것을 볼 수 있을 것입니다. 이 글에서는 Couchbase Rails의 보석인 Couchbase-Model로 데이터를 모델링하는 방법, Couchbase의 보기를 사용하여 대화형 애플리케이션을 만드는 방법, 이러한 보기를 쿼리하여 애플리케이션에서 사용할 특정 데이터 하위 집합을 가져오는 방법을 살펴봤습니다.

앱 내부의 모든 것(스타일링 등)이 이 글에 포함되어 있지는 않지만 중요하지 않다는 것을 알고 있습니다. Couchbase-Model, 문서 모델링, 뷰 및 쿼리 등 주요 사항을 충분히 다루었으므로 Couchbase-Model 젬을 사용하여 자신만의 Rails 앱을 시작할 수 있다고 느끼셨기를 바랍니다.

런던 출신인 경우, 다음과 같이 가입하세요. 카우치베이스 런던 밋업 앞으로 몇 주 동안 문서 모델링, 카우치베이스 모바일 및 기타 여러 주제에 대해 자세히 설명하는 이벤트를 개최할 예정이니 많은 관심 부탁드립니다.

여기까지 읽으셨다면 진심으로 축하드립니다! 글이 길었다는 것을 알고 있습니다! 질문이 있으시면 언제나처럼 기꺼이 답변해 드리겠습니다. 트위터에서 저에게 연락하세요. @Rbin 를 클릭하고 궁금한 점이 있으면 질문해 주세요!

로빈 존슨
개발자 옹호자, 유럽.

작성자

게시자 카우치베이스 팀

의 선임 웹 관리자입니다. 웹 사이트 관리자로서 디자인, 구현, 콘텐츠 및 성능을 포함한 웹 사이트 자산에 대한 전반적인 책임을 맡고 있습니다.

댓글 하나

  1. 좋은 게시물입니다! 공유해 주셔서 감사합니다

  2. 고마워요. 페이스북 옴니노트와 함께 사용했는데 마법처럼 작동합니다. :)

  3. 안녕, 로빈
    Rails 앱에서 작업 중인데 이미지를 블롭/바이너리 문서로 Couchbase에 저장하는 데 문제가 있습니다. Couchbase-model의 속성에 블롭을 저장하려고 시도했지만 제대로 처리되지 않는 것 같습니다. 카우치베이스에서 이미지를 저장하고 검색하는 간단한 방법이 있는지 알아보기 위해 카우치베이스 모델을 더 깊이 파헤칠 계획이지만 알고있는 것이 있는지 알고 싶었습니다. 고마워요

  4. [...] 금주의 블로그 게시물 #1: 샘플 애플리케이션 - 루비 온 레일즈와 카우치베이스 - 소셜... [...]

댓글 남기기