스테이크 위자드

10945 단어 reactrails
필리 치즈스테이크. 당신이 그것을 좋아하든 싫어하든, 당신은 아마 어느 것이 최고인지에 대한 끝없는 논쟁을 들었을 것입니다.

Enter Steak Whizard - Philly에서 최고의 스테이크를 찾는 전용 웹 애플리케이션입니다. 검토하고 평가하고 토론을 해결합시다.

이 애플리케이션은 React 프론트엔드(및 Bootstrap 라이브러리의 많은 도움)와 PostgreSQL 데이터베이스가 있는 Ruby on Rails 백엔드로 구축되었습니다. Heroku에서 호스팅됩니다.

데이터베이스의 테이블에 매핑되는 User, Steak, Review의 세 가지 고유한 Rails 모델이 있습니다. Review 테이블은 하나의 User 인스턴스와 하나의 Steak 인스턴스에 속하는 조인 테이블입니다.

class Review < ApplicationRecord
    validates :rating, presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 10 }
    validates :toppings, presence: true
    validates :title, presence: true

    belongs_to :user
    belongs_to :steak
end


사용자는 리뷰를 통해 많은 리뷰와 많은 스테이크를 가지고 있습니다.

class User < ApplicationRecord
    validates :username, presence: true, uniqueness: true
    validates :fav_steak, presence: true

    has_many :reviews
    has_many :steaks, through: :reviews
end


스테이크에는 리뷰가 많고 리뷰를 통해 많은 사용자가 있습니다.

class Steak < ApplicationRecord
    validates :restaurant, presence: true, uniqueness: true

    has_many :reviews
    has_many :users, through: :reviews
end


모델은 유효한 데이터가 데이터베이스에 저장되고 있는지 확인하기 위해 활성 레코드 유효성 검사도 사용합니다.

사이트는 사용자에게 사용자 이름과 비밀번호로 계정을 생성하도록 요청합니다. 암호는 BCrypt로 소금에 절이고 해시되며 데이터베이스에 안전하게 저장됩니다.

사용자가 고유한 사용자 이름으로 계정을 성공적으로 생성하면 사용자 컨트롤러 내에서 사용자의 특정 ID로 세션이 생성됩니다.

def create
    user = User.create!(user_params)
    session[:user_id] = user.id
    render json: user, status: :created
end


응용 프로그램 컨트롤러 내에서 비공개authorize 메서드는 세션에 있는 :user_id에 의해 현재 사용자를 찾아 인스턴스 변수@current_user에 할당하여 변수가 참이 아니면(즉, 사용자가 존재하지 않는) 오류 응답을 렌더링합니다. :

before_action :authorize

private

def authorize
    @current_user = User.find_by(id: session[:user_id])
    render json: { error: ["Not authorized"] }, status: :unauthorized unless @current_user
end


컨트롤러 작업 전에 실행되는 메서드인 before_action 필터에 유의하십시오. 다른 컨트롤러는 애플리케이션 컨트롤러에서 상속되므로 사용자가 요청한 콘텐츠를 볼 수 있는 권한이 부여됩니다.

애플리케이션에는 클라이언트측 라우팅에서 제공하는 4개의 페이지(홈, 베스트 스테이크, 내 리뷰 및 스테이크 추가)가 있습니다.

홈은 시작 페이지 역할을 하며 Steak 클래스의 각 인스턴스를 카드 구성 요소로 렌더링합니다. 카드에는 사용자 리뷰 및 좋아하는 스테이크에 따라 조건부로 렌더링되는 "즐겨찾기"및 "리뷰"버튼이 있습니다.

백 엔드에서 사용자가 스테이크를 리뷰할 때 POST 요청은 리뷰 컨트롤러의 create 메서드를 가리킵니다.

class ReviewsController < ApplicationController

    def create
        review = @current_user.reviews.create!(review_params)
        steak = Steak.find(params[:steak_id])
        steak.update(rating: steak.calc_avg_rating)
        render json: @current_user, status: :created
    end

    private

    def review_params
        params.permit(:steak_id, :title, :comment, :rating, :toppings)
    end
end


이 메서드는 @current_user 변수에 저장된 사용자와 연결될 Review 클래스의 새 인스턴스를 만듭니다.

검토된 스테이크는 params 해시의 [:steak_id]에 액세스하여 찾습니다. 스테이크의 등급은 인스턴스 메서드calc_avg_rating에서 반환된 값으로 업데이트됩니다.

class Steak < ApplicationRecord
    def calc_avg_rating
        self.reviews.average(:rating)
    end
end


이 방법은 Active Record 연결 및 방법을 활용하여 스테이크와 관련된 리뷰에서 평균 평점을 계산합니다.

Best Steak 페이지는 API 끝점/steaks/highest-rated에서 가져오고 연결된 리뷰와 함께 해당 스테이크를 렌더링합니다. 백엔드에서 엔드포인트는 스테이크 컨트롤러의 highest_rated 메서드를 가리킵니다.

def highest_rated
    max = Steak.maximum(:rating)
    render json: Steak.where(rating: max)
end


스테이크 Serializer에서 설정된 has_many :reviews 관계 덕분에 페이지에서 스테이크 관련 리뷰도 렌더링됩니다.

class SteakSerializer < ActiveModel::Serializer
    attributes :id, :restaurant, :rating
    has_many :reviews
end


마찬가지로 내 리뷰 페이지에는 동일한 연결을 사용하지만 사용자 직렬 변환기에 있는 현재 사용자 인스턴스와 연결된 리뷰가 표시됩니다.

class UserSerializer < ActiveModel::Serializer
  attributes :id, :username, :fav_steak

  has_many :reviews
  has_many :steaks
end


마지막으로 스테이크 추가 페이지에서 사용자는 스테이크 클래스의 새 인스턴스를 만들고 해당 리뷰를 남길 수 있습니다.

스테이크 위자드가 있습니다. 한 번 돌려보고 당신의 생각을 알려주세요. 그 과정에서 좋아하는 Philly Cheesesteak를 찾을 수도 있습니다.

좋은 웹페이지 즐겨찾기