스테이크 위자드
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를 찾을 수도 있습니다.
Reference
이 문제에 관하여(스테이크 위자드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/michaellobman/steak-whizard-2ikb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)