Ruby On Rails를 사용하여 코스 추적기 구축

대부분의 개발자들은 Udemy, Coursera, Edx 등 다양한 플랫폼에서 온라인 수업에 참가한다...이 문서에서 저는 Ruby on Rails를 사용하여 과정의 진행을 추적하는 데 도움이 되는 기초 과정 추적 응용 프로그램을 구축하는 방법을 설명하겠습니다.

이 강좌에서 나는 사용할 것이다
  • Ruby 2.6.3
  • 궤도 5.2.6
  • 부팅 5
  • SQLite 데이터베이스
  • 하지만 이 차근차근 튜토리얼은 최신 루비 & 레일스 버전에도 적용된다.
    색인:
  • Create a project
  • Start server
  • Create Model, Controller and Views
  • Database Migration
  • Change Application Root
  • Integrate Bootstrap
  • Add Navigation Bar
  • Add Course status Select option
  • Styling Course Forms
  • 프로젝트 만들기


    rails new course-tracker
    
    이 명령은 다음 구조를 가진 항목을 생성합니다course-tracker.
    cd course-tracker/
    
    ├── Gemfile
    ├── Gemfile.lock
    ├── README.md
    ├── Rakefile
    ├── app
    ├── bin
    ├── config
    ├── config.ru
    ├── db
    ├── lib
    ├── log
    ├── package.json
    ├── public
    ├── storage
    ├── test
    ├── tmp
    └── vendor
    
    11 directories, 6 files
    

    서버 시작

  • 실행 rails server 또는 rails s(단축키)로 서버를 시작하고 브라우저에 액세스 http://localhost:3000 합니다.오류가 없으면 다음 화면을 볼 수 있습니다.

  • 모델, 컨트롤러 및 뷰 작성

    Course를 사용하여 rails scaffold 모델과 상응하는 컨트롤러를 만듭니다.
    Rails의 scaffold는 완전한 모델, 이 모델의 데이터베이스 이동, 컨트롤러를 조작하는 것, 데이터를 보고 조작하는 보기, 그리고 상기 각 항목의 테스트 세트입니다.DellCourse 모델에는 다음 필드가 있습니다.
  • 머리글 - 문자열
  • 이미지 url-문자열
  • url-문자열
  • 상태 - 문자열
  • 시작 - 날짜 시간
  • 완료 - 날짜 시간
  • rails g scaffold Course title:string image_url:string url:string status:string started:datetime completed:datetime
    
    이것은 도서 모형, 보기, 컨트롤러가 있는 파일을 생성합니다.
          invoke  active_record
          create    db/migrate/20210527131258_create_courses.rb
          create    app/models/course.rb
          invoke    test_unit
          create      test/models/course_test.rb
          create      test/fixtures/courses.yml
          invoke  resource_route
           route    resources :courses
          invoke  scaffold_controller
          create    app/controllers/courses_controller.rb
          invoke    erb
          create      app/views/courses
          create      app/views/courses/index.html.erb
          create      app/views/courses/edit.html.erb
          create      app/views/courses/show.html.erb
          create      app/views/courses/new.html.erb
          create      app/views/courses/_form.html.erb
          invoke    test_unit
          create      test/controllers/courses_controller_test.rb
          create      test/system/courses_test.rb
          invoke    helper
          create      app/helpers/courses_helper.rb
          invoke      test_unit
          invoke    jbuilder
          create      app/views/courses/index.json.jbuilder
          create      app/views/courses/show.json.jbuilder
          create      app/views/courses/_course.json.jbuilder
          invoke  assets
          invoke    coffee
          create      app/assets/javascripts/courses.coffee
          invoke    scss
          create      app/assets/stylesheets/courses.scss
          invoke  scss
          create    app/assets/stylesheets/scaffolds.scss
    

    데이터베이스 마이그레이션

  • Scaffold 명령은 Course에서 테이블을 만드는 데 사용되는 데이터베이스 이전도 생성했다
  • class CreateCourses < ActiveRecord::Migration[5.2]
      def change
        create_table :courses do |t|
          t.string :title
          t.string :image_url
          t.string :url
          t.string :status
          t.datetime :started
          t.datetime :completed
    
          t.timestamps
        end
      end
    end
    
  • 데이터베이스 마이그레이션을 수행하려면 db/migrate/20210527131258_create_courses.rb 명령을 사용하십시오.
  • ➜  course-tracker git:(master) ✗ rails db:migrate
    == 20210527131258 CreateCourses: migrating ====================================
    -- create_table(:courses)
       -> 0.0008s
    == 20210527131258 CreateCourses: migrated (0.0008s) ===========================
    

    응용 프로그램 루트 변경

  • 현재 마이그레이션이 완료되었습니다.응용 프로그램 홈 페이지 (914) 를 가리킵니다.
  • 업데이트rails db:migrate는 루트를 과정 컨트롤러에 대한 색인 조작을 가리킨다.
  • Rails.application.routes.draw do
      resources :courses
      root 'courses#index'
    end
    

    통합 부팅

  • Course#Index에서 안내 css 및 관련 js 파일 가져오기
  • <!DOCTYPE html>
    <html>
      <head>
        <%= csrf_meta_tags %>
        <%= csp_meta_tag %>
    
        <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
        <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    
        <!-- Bootstrap CSS -->
        <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
    
        <title>Course Tracker</title>
    
      </head>
    
      <body>
        <div class="container">
         <%= yield %>
        </div>
        <!-- Option 1: Bootstrap Bundle with Popper -->
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
      </body>
    </html>
    

    탐색 모음 추가

  • 모든 페이지에 내비게이션 표시줄을 추가합니다.프로그램 레이아웃에 추가하면 모든 웹 페이지에 내비게이션 표시줄을 불러옵니다.
  • 다음과 같은 html 내용을 포함하는 파일을 만듭니다config/routes.rb.
  • <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
      <div class="container-fluid">
        <a class="navbar-brand" href="/">Course Tracker</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
          <div class="navbar-nav">
            <a class="nav-link active" aria-current="page" href="/courses">Courses</a>
          </div>
        </div>
      </div>
    </nav>
    
  • app/views/layouts/application.html.erb에서 렌더링app/views/layouts/_navbar.html.erb됩니다.응용 프로그램 레이아웃navbarapp/views/layouts/application.html.erb를 추가하면 다음과 같다.
  • <body>
        <%= render 'layouts/navbar' %>
        <div class="container">
         <%= yield %>
        </div>
        ..
        ..
    </body>
    

    코스 상태 선택 옵션 추가


    우리는 <%= render 'layouts/navbar' %> 모델에 <body> 필드가 있다.지금 우리는 이것이 단지 세 개의 값만 있기를 바란다.
  • 곧 다가온다. - 아직 수업을 시작하지 않았고 소망 리스트에 있다면 이 상태를 사용하세요.
  • 진행 중 - 학습 중인 경우 이 상태를 사용합니다.
  • 완료 - 과정을 완료한 경우 이 상태를 사용합니다.
  • status를 열고 Course 필드를 다음과 같이 업데이트합니다.
      <div class="field">
        <%= form.label :status %>
        <%= form.select :status , ['Upcoming','In Progress','Completed']%>
      </div>
    
    이 항목을 추가하면 창설 폼은 다음과 같습니다 app/views/courses/_form.html.erb

    과정 형식을 설계하다.


    현재 우리는 과정 인덱스에 스타일을 추가하고 폼을 만들고 편집할 것입니다.

    1. 양식 편집/작성을 위한 스타일 추가

  • status를 다음과 같은 html로 변경합니다.
  • <%= form_with(model: course, local: true) do |form| %>
      <% if course.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(course.errors.count, "error") %> prohibited this course from being saved:</h2>
    
          <ul>
          <% course.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
          </ul>
        </div>
      <% end %>
    
      <div class="field">
        <%= form.label :title %>
        <%= form.text_field :title, class: "form-control" %>
      </div>
    
      <div class="field">
        <%= form.label :image_url %>
        <%= form.text_field :image_url, class: "form-control" %>
      </div>
    
      <div class="field">
        <%= form.label :url %>
        <%= form.text_field :url, class: "form-control" %>
      </div>
    
      <div class="field">
        <%= form.label :status %>
        <%= form.select :status , ['Upcoming','In Progress','Completed'], class: "form-select"%>
      </div>
    
      <div class="field">
        <%= form.label :started %>
        <%= form.datetime_select :started, class: "form-control" %>
      </div>
    
      <div class="field">
        <%= form.label :completed %>
        <%= form.datetime_select :completed, class: "form-control" %>
      </div>
    
      <div class="actions">
        <%= form.submit 'Submit', class: "btn btn-primary"  %>
      </div>
    <% end %>
    
    
  • http://localhost:3000/courses/new를 다음과 같은 html로 변경합니다.
  • <h1>Edit Course</h1>
    
    <%= render 'form', course: @course %>
    
    <br/>
    <%= link_to 'Show', @course , class: "btn btn-primary active" %> 
    <%= link_to 'Back', courses_path , class: "btn btn-primary active" %>
    
    
    스타일을 설정한 후 코스 양식을 편집하는 방법은 다음과 같습니다.

    2. 양식을 표시할 스타일을 추가합니다.

  • app/views/courses/_form.html.erbapp/views/courses/edit.html.erbcan_show_started? 방법을 첨가한다.이러한 방법은 can_show_completed? 디스플레이app/models/course.rbstarted 시간 스탬프를 기반으로 하는 데 도움이 될 것이다.
  • class Course < ApplicationRecord
    
        def can_show_started?
            self.status.eql?("In Progress") || self.status.eql?("Completed")
        end
    
        def can_show_completed?
            self.status.eql?("Completed")
        end
    end
    
  • completed를 다음과 같은 html로 변경합니다.
  • <p id="notice"><%= notice %></p>
    
    <br/> <br/>
    
    <div class="card w-50">
      <div class="card-header">
        <h3> <%= @course.title %> <h3>
      </div>
      <div class="card-body">
        <img src="<%= @course.image_url %>"/>
    
        <h5 class="card-title"><strong>Status : </strong> <%= @course.status %></h5>
    
        <% if @course.can_show_started? %>
          <h5 class="card-title"><strong>Started : </strong><%= @course.started %></h5>
        <% end %>
    
        <% if @course.can_show_completed? %>
          <h5 class="card-title"><strong>Completed : </strong><%= @course.completed %></h5>
        <% end %>
    
        <a href="<%= @course.url %>" class="btn btn-primary active">Go To Course</a>
      </div>
    </div>
    
    <br/> <br/>
    <%= link_to 'Edit', edit_course_path(@course) , class: "btn btn-primary active"%>
    <%= link_to 'Back', courses_path , class: "btn btn-primary active"%>
    
    
    조형이 끝난 후 전시 과정의 형식은 다음과 같다.

    3. 코스 목록 페이지에 스타일 추가

  • 현재 우리는 이미 프로젝트의 마지막 단계에 이르렀다.우리는 단지 우리의 홈페이지를 설계할 수 있을 뿐이다.i, e 과정 목록 페이지.
  • 다음 html로 새 파일을 만듭니다status.
  • <div class="row">
        <div class="card border-light">
          <div class="card-body">
            <h3 class="card-title text-primary"><%= section %></h3>
          </div>
        </div>
    </div>
    <br/>
    
  • 다음 html로 새 파일을 만듭니다app/views/courses/show.html.erb.
  • <div class="row row-cols-1 row-cols-md-4 g-4">
      <% courses.each do |course| %>
        <div class="card border-dark">
          <img src="<%= course.image_url %>" class="card-img-top" alt="<%= course.title %>">
          <div class="card-body">
            <h5 class="card-title"><a href="<%= course.url%>"><%= course.title %></a></h5>
          </div>
          <ul class="list-group list-group-flush">
            <h4 class="list-group-item"><strong><%= course.status %><strong></h4>
            <% if course.can_show_started? %>
              <li class="list-group-item"><strong>Started : </strong><%= course.started.strftime('%d-%b-%Y') %></li>
            <% end %>
    
            <% if course.can_show_completed? %>
              <li class="list-group-item"><strong>Completed : </strong><%= course.completed.strftime('%d-%b-%Y') %></li>
            <% end %>
          </ul>
          <div class="card-body">
            <%= link_to 'Show', course, class: "card-link" %>
            <%= link_to 'Edit', edit_course_path(course) , class: "card-link"%>
            <%= link_to 'Delete', course, method: :delete, data: { confirm: 'Are you sure?' }, class: "card-link" %>
    
          </div>
        </div>
      <% end %>
    </div>
    
    <br/>
    
  • 업데이트app/views/courses/_card_section_title.html.erb를 통해 상태별 강좌로 돌아가기
  •   def index
        @upcoming_courses = Course.all.select {|c| c.status.eql?("Upcoming")}
        @completed_courses = Course.all.select {|c| c.status.eql?("Completed")}
        @inprogress_courses = Course.all.select {|c| c.status.eql?("In Progress")}
      end
    
    
  • 파일app/views/courses/_course_cards.html.erb을 다음과 같은 html로 업데이트합니다.
  • <p id="notice"><%= notice %></p>
    
    <% if @upcoming_courses.length > 0 %>
      <%= render 'courses/card_section_title', section: "Upcoming Courses" %>
      <%= render 'courses/course_cards', courses: @upcoming_courses %>
    <% end %>
    
    <% if @inprogress_courses.length > 0 %>
      <%= render 'courses/card_section_title', section: "Inprogress Courses" %>
      <%= render 'courses/course_cards', courses: @inprogress_courses %>
    <% end %>
    
    <% if @completed_courses.length > 0 %>
      <%= render 'courses/card_section_title', section: "Completed Courses" %>
      <%= render 'courses/course_cards', courses: @completed_courses %>
    <% end %>
    
    
    <br>
    
    <%= link_to 'New Course', new_course_path , class: "btn btn-primary active"%>
    
  • 탐색 모음app/controllers/courses_controller.rb에 링크 추가app/views/courses/index.html.erb
  • <nav class="navbar navbar-expand-lg  navbar-dark bg-primary">
      <div class="container-fluid">
        <a class="navbar-brand" href="/">Course Tracker</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
          <div class="navbar-nav">
            <a class="nav-link active" aria-current="page" href="/courses">Courses</a>
            <a class="nav-link active" aria-current="page" href="/courses/new">New Course</a>
          </div>
        </div>
      </div>
    </nav>
    
  • 과정 인덱스 페이지의 스타일을 설정한 후에 최종적으로 다음과 같이 보입니다.

  • 이것은 매우 긴 강좌다.이거 좋아했으면 좋겠어...!!
    Github here에서 완전한 코드를 찾습니다.이것을 좋아하신다면, 이 Github 저장소에 star를 제공해 주십시오.

    읽어주셔서 감사합니다.


    네가 이 자원들이 유용하다고 생각하기를 바란다.만약 당신이 읽은 내용을 좋아한다면 시스템 설계, 마이크로 서비스와 기타 기술과 관련된 더 많은 것을 알고 싶습니다...너는 나를 따라와도 된다
  • ###### 트위터 -
  • ###### 내 주간 통신 구독here
  • 좋은 웹페이지 즐겨찾기